为什么C++不能有虚构造函数,却能有虚析构函数
C++的动态绑定通过虚函数表实现(vtable),在类有一个vptr指针指向vtable
但是当类构造是,对象还没有构造起来,这时候,也就不存在vptr,所以不能有虚构造函数
对于析构函数,动态绑定是没问题的;
并且一般要加上virual,假如定义Base *b=new Derive(),析构函数不是virtual的
这样当对象别注销的时候,系统只会调用~Base(),并不会调用~Derive(),因为b是Base类型已近别静态绑定析构函数
但对于virtual析构函数,调用是会调用Derive的析构函数,再有Derive的析构函数调用Base的析构函数,这样,就不会造成内存泄露
从另一个角度也可以看出构造函数不能为虚函数,
1,虚函数的作用在于通过父类的指针或者引用调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类或者引用去调用,因此就规定构造函数不能是虚函数。
2,构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它
但析构却不一定,我们往往通过基类的指针来销毁对象。这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数
原文:http://www.cnblogs.com/li-xingtao/p/4371015.html