1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性
实例如下:#include "iostream"using namespace std;class Base{public:Base(){cout << "Base::Base()\n";fun();}virtual ~Base(){cout << "Base::Base()\n";fun();}virtual void fun(){cout << "Base::fun() virtual\n";}};// 派生类class Derive: public Base{public:Derive(){cout << "Derive::Derive()\n";fun();}~Derive(){cout << "Derive::Derive()\n";fun();}virtual void fun(){cout << "Derive::fun() virtual\n";}};int main(){Base *b = new Base();delete b;cout << "-----------------------------------\n";Derive *d = new Derive();delete d;cout << "-----------------------------------\n";Base *bd = new Derive(); // 基类Base的指针bd指向的是派生类Derive的对象delete bd;return 0;}
解释: 第一段代码不加说明,第二段代码Derive *d = new Derive();先调用类的构造函数,这个构造函数是基类Base的fun()函数,因为此时派生类Derive还不存在,然后才构造派生类Derive。析构时,先析构派生类Derive,并调用派生类的fun()函数,再析构基类。第三段代码Base *bd = new Derive();基类Base的指针bd指向派生类对象。构造时,先调用基类Base的构造函数,此时构函数中调用基类中的fun()函数,此时虚函数的动态绑定机制并没有会生效,这是因为此时的派生类还不存在。析构时,先析构派生类,派生类中的fun()函数调用的是自己的fun(),然后析构基类Base,基类析构函数中的fun()调用的是基类Base自己的fun()函数,这里虚函数的动态绑定机制也没有生效,因为此时派生类已经不存在了。