初见这个内容是在Effective C++上,在构造函数和析构函数中调用虚函数是非常不好的行为
一个简单的例子
- class Base
- {
- public:
- Base()
- {
- cout<<"Base::Base()"<<endl;
- }
- ~Base()
- {
- fun();
- cout<<"Base::~Base()"<<endl;
- }
- virtual void fun()
- {
- cout<<"Base::fun()"<<endl;
- }
- };
- class Derived : public Base
- {
- public:
- Derived()
- {
- cout<<"D::D()"<<endl;
- }
- ~Derived()
- {
- cout<<"D::~D()"<<endl;
- }
- virtual void fun()
- {
- cout<<"D::fun()"<<endl;
- }
- };
- void area()
- {
- Derived d;
- }
执行 area() 后,得到的结果是
Base::Base()
D::D()
D::~D()
Base::fun()
Base::~Base()
本来在Base的析构函数中调用一个虚函数的意图很有可能是调用子类override版本
但是,由于C++的析构机制,子类总是先父类析构
所以,这样的意图不可能实现,也就是书中所说的,在析构和构造函数中的虚函数不是虚函数!