构造函数不能是虚函数
- 虚函数调用是一种在给出部分信息的情况下完成工作的机制,我们可以只知道接口而不知道对象的确切类型。即可以通过父类的指针或引用来调用子类的那个成员函数。
- 而创建一个对象,需要知道对象的完整信息,需要知道你想要创建的类的确切类型。
- 因此,构造函数不应该被定义为虚函数。
析构函数什么时候声明为虚函数
- 该类具有至少一个虚函数的时候,表示该类充当派生类的接口,这个时候要把基类析构函数声明为虚函数。
- 派生类对象构造的时候先调用基类的构造函数再调用派生类的构造函数;析构的时候先调用派生类的析构函数,再调用基类的析构函数。
- 派生类的析构函数只会析构自己的那部分,如果基类的析构函数不是虚函数,使用父类的指针或引用调用子类的时候,则只能调用基类的析构函数,而无法调用派生类的析构函数,派生类的成员没有被析构,会造成内存泄露。
- 如果不需要基类对派生类及对象进行操作时候,不能将析构函数定义为虚函数,因为这样会增加内存开销(虚函数表,里面存放虚函数指针)。