方法一:經過將類的構造函數和析構函數聲明成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; }