有人說聲明 Private Destructor, 這對象只能在 stack 上創建,不能在Heap上創建, 其實錯了, 這樣的程序編譯都過不了.
那為何會有 Private Destructor, 因為程序是這樣寫的
------------------------------------
class Base {
public:
Base();
protected:
virtual ~Base();
friend class Base_Friend;
};
------------------------------------
class Child : public Base{
public:
Child();
private:
virtual ~Child();
};
如此可以達到2個目的
1) 只能通過 delete base 才能調用 Child的Destructor
2) Child 不能再有 子類了
看看Android 的 Refbase 和 Overlay 的關系
class Overlay : public virtual RefBase
{
...
private:
virtual ~Overlay();
}
class RefBase
{
public decStrong();
...
protected:
RefBase();
virtual ~RefBase();
}
注意到 ~RefBase(); 是 protected, 那個如何 delete RefBase 呢? 原來它提供 decStrong() 方法, 要刪除對象只有通過這個方法了
void RefBase::decStrong(const void* id) const
{
....
delete this;
....
}
RefBase 是提供給 wp<T> 和 sp<T> 使用的, 這種方法說明了RefBase不希望外部程序才進行對象new delete 管理