在這個關於Curiously Recurring Template Patten的網頁中,可以在堆棧上實例化派生類(Object Counter示例,其中基類模板具有受保護的析構函數):CRTP-wiki ..我編譯了自己。受保護的析構函數禁止在堆棧上創建派生類的對象?
template <typename T>
struct counter
{
static int objects_created;
static int objects_alive;
counter()
{
++objects_created;
++objects_alive;
}
counter(const counter&)
{
++objects_created;
++objects_alive;
}
protected:
~counter() // objects should never be removed through pointers of this type
{
--objects_alive;
}
};
template <typename T> int counter<T>::objects_created(0);
template <typename T> int counter<T>::objects_alive(0);
class X : counter<X>
{
// ...
};
class Y : counter<Y>
{
// ...
};
但這種回答說使基類的析構函數保護將禁止在堆棧上實例化派生類:answer:
前面已經回答了,波科:: RefCountedObject保護了析構函數,因此所有的類繼承它不能在堆棧上創建....
所以,
(1)是這個答案錯了?還是我誤解了?
(2)爲什麼CRTP示例使析構函數受到保護?是否意味着禁止在堆棧上實例化基類模板的專門化?我可以在堆上實例化基類模板的專門化(我試過了,我不能,但不知道爲什麼)?
在此先感謝!
請勿鏈接到代碼示例。鏈接死亡。把代碼放在問題中。特別是不要鏈接到包含大量不相關代碼示例的頁面。你真的期望每個人都*看*你想問什麼? – StoryTeller
@StoryTeller感謝您指出這一點,我已經添加了代碼。但請下次再問:) – user8385554
好吧,很簡單。由於寫作錯誤或缺乏知識,您鏈接的答案是錯誤的。受保護的析構函數不會阻止創建被欺騙的對象。 – StoryTeller