虚构造函数:构造函数不可以是虚的,要构造一个对象必须掌握所创建的对象的确切类型,不过它所想达到的效果是可以变相实现。
方法一:创建有关类型的新对象
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个字符,返回一个到它的指针
}
虽然构造函数不能是虚的,但可以通过创建新对象的方法实现类似效果,如使用`createNewInstance`。另一方面,虚析构函数确保在基类指针删除派生类对象时,能正确调用派生类的析构函数。此外,基类定义的`new`和`delete`操作符可以使用`size_t`参数来进一步定制内存管理。
878

被折叠的 条评论
为什么被折叠?



