<Effective C++> Item 9:绝不在构造和析构过程中调用虚函数
2017-05-30 16:31
603 查看
这个应该是C++面试的经典题了,所以值得拿出来说一说
比如在一个继承体系中,基类的构造函数中调用了一个基类的成员函数,你把它声明为
接下来实例化对象,当我们执行
因为
析构函数也是同样的道理,析构的顺序是
如果希望创建一个基类,运行时动态绑定适当的
我们可以对期望函数通过参数传递信息,然后再
比如在一个继承体系中,基类的构造函数中调用了一个基类的成员函数,你把它声明为
virtual,至少你在设计的时候是认为它有
virtual属性的。
class Base{ public: Base(); virtual void someFunction()=0; ... } Base::Base(){ ... someFunction(); } class DerivedOne:public Base{ public: DerivedOne(); virtual void someFunction() override; ... } class DerivedTwo: public Base{ public: DerivedTwo(); virtual void someFunction() override; ... }
接下来实例化对象,当我们执行
DerivedOne b;
因为
DerivedOne是一个派生类,那么会先调用基类的构造函数
Base(),构造派生类中的基类子部分,但是这是
Base()函数调用的不是我们期望的
DerivedOne中被
override的函数,这就是问题所在,在基类构造期间,virtual函数不会下降到derived阶层,这时virtual函数与普通类内成员函数等价,其实也很好理解,在构造基类期间,派生类根本没有被构造出来,何来
override之说?一直在
DerivedOne对象被构造出来之前,
b的类型都是
Base,可以通过
typeid和
dynamic_cast验证。
析构函数也是同样的道理,析构的顺序是
自下而上的,所以当
derived class被析构后,它的对象就不存在了,等到
base class运行阶段,
virtual函数也就是基类本身的那个函数了,
virtual属性失去了意义。
如果希望创建一个基类,运行时动态绑定适当的
override函数,那么一定不要在构造/析构函数中调用
virtual,可以有其他的解决方案。
我们可以对期望函数通过参数传递信息,然后再
derived class构造函数的初始化列表中将信息传递进去。
class Base{ public: Base(); void someFunction(const string& s)=0; //non-virtual ... } Base::Base(const string& s){ ... someFunction(s); } class DerivedOne:public Base{ public: DerivedOne():Base(createInfo()); //形如这样 ... private: string createInfo(...); }
相关文章推荐
- Effective C++ Item 9 绝不在构造和析构过程中调用virtual函数
- Effective C++——》条款9:绝不在构造和析构过程中调用virtual函数
- Effective C++ Item 9 绝不在构造和析构过程中调用virtual函数
- Effective C++ 条款09 绝不在构造和析构过程中调用virtual函数
- Effective C++ <二>:构造,析构,赋值运算
- Item 9:绝不在构造和析构过程中调用虚函数【effective C++读书笔记】
- effective c++条款9(绝不在构造和析构过程中调用virtual函数)
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数
- Effective c++(3th) Item9:绝不要在构造和析构期间调用虚拟函数
- 条款9:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- <Effective C++> (Item 13-15): 以对象管理资源
- 【Effective_c++】条款09:绝不在构造和析构函数中调用virtual函数
- Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- Effective C++:条款09:绝不在构造和析构过程中调用virtual函数
- 《Effective C++》读书笔记09:绝不在构造和析构过程中调用virtual函数
- 读书笔记_Effective_C++_条款九:绝不在构造和析构函数中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数