虛構造函數:構造函數不可以是虛的,要構造一個對象必須掌握所創建的對象的確切類型,不過它所想達到的效果是可以變相實現。
方法一:創建有關類型的新對象
class Base
{
public:
Base(); //默認構造
Base(const Base&); //賦值構造
virtual Base* createNewInstance(){ return new Base(); }
}
class Derived
{
public:
Derived();
Derived(const Derived&);
Derived* createNewInstance(){ return new Derived(); }
}
void func(Base* p)
{
Base* pp = p->createNewInstance();
//...
}
方法二:抽象工廠,具體就不展開了(可以去參閱設計模式的有關書籍)。
虛析構函數:用一個基類的指針刪除一個派生類的對象時,派生類的析構函數會被調用,用於基類定義中。
例如基類定義new和delete操作符用到size_t參數時
class base
{
//...
public
//...
void * operate new(size_t);
}
void* base::operate new(size_t s)
{
//分配s個字符,返回一個到它的指針
}