劍指offer——不能被繼承的類

方法一:經過將類的構造函數和析構函數聲明成private來防止子類繼承。聲明靜態的方法來構造和析構類的對象。ios

可是用起來不是很方便。只能獲得在堆上的實例,而不能獲得在棧上的實例。函數

 

方法二:構造輔助類CBase,聲明CTest爲CBase友元類,並將本身的構造和析構聲明爲private,而後CTest虛繼承CBase。spa

根據虛繼承的特性,虛基類的構造函數由最終的子類負責構造。
code

可是這種方法的可移植性很差,雖然在VS中可以編譯,可是GCC中對friend的要求不一樣於VS。目前最新的GCC還不支持模板參數類型做爲友元類型。對象

#include <iostream>
using namespace std;

class CBase
{
public:
    friend class CTest;
private:
    CBase(){cout<<"base::construct"<<endl;}
    ~CBase(){cout<<"base::destruct"<<endl;}
};

class CTest:virtual public CBase
{
public:
    CTest(){cout<<"CTest::construct"<<endl;}
    ~CTest(){cout<<"CTest::destruct"<<endl;}
};

void main()
{
    CTest *t=new CTest();
    delete t;
}
相關文章
相關標籤/搜索