初见这个内容是在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++的析构机制,子类总是先父类析构
所以,这样的意图不可能实现,也就是书中所说的,在析构和构造函数中的虚函数不是虚函数!
本文通过一个简单的C++示例说明了在基类的构造函数和析构函数中调用虚函数的问题。由于C++的析构顺序机制,这种做法往往无法达到调用子类覆盖版本的目的。
1619

被折叠的 条评论
为什么被折叠?



