虚构造函数:构造函数不可以是虚的,要构造一个对象必须掌握所创建的对象的确切类型,不过它所想达到的效果是可以变相实现。
方法一:创建有关类型的新对象
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个字符,返回一个到它的指针
}