关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Technique FAQ里面做过回答
Avirtual call is a mechanism to get work done given partialinformation. In particular, "virtual" allows us to call afunction knowing only an interfaces and not the exact type of theobject. To create an object you need complete information. Inparticular, you need to know the exact type of what you want tocreate. Consequently, a "call to a constructor" cannot bevirtual.
出处:Stroustrup: C++ Style and Technique FAQ
含义大概是这样的:虚函数调用是在部分信息下完成工作的机制,允许我们只知道接口而不知道对象的确切类型。 要创建一个对象,你需要知道对象的完整信息。 特别是,你需要知道你想要创建的确切类型。 因此,构造函数不应该被定义为虚函数。
从C++之父Bjarne的回答我们应该知道C++为什么不支持构造函数是虚函数了,简单讲就是没有意义。虚函数的作用在于通过父类的指针或引用来调用子类的某个成员函数。而构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用。
析构必须是虚函数
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而子类的析构函数执行完后又自动调用父类的析构函数,这样整个子类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用父类的析构函数而不调用子类析构函数,这样就会造成子类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。