构造函数和析构函数中的虚函数调用[重复]
Posted
技术标签:
【中文标题】构造函数和析构函数中的虚函数调用[重复]【英文标题】:virtual function calls in constructor and destructor [duplicate] 【发布时间】:2013-09-06 00:13:01 【问题描述】: class Base
public:
Base()Foo();
~Base()Foo();
virtual void Foo()std::cout<<"base";
;
class Derived: public Base
public:
Derived()Foo();
~Derived()Foo();
void Foo()std::cout<<"derived";
;
//main
Derived d;
知道为什么这段代码会打印出“base”和“derived”吗? 我知道建议不要将虚函数调用放在构造函数或析构函数中,我只想知道为什么上面的代码会有这种行为。谢谢
【问题讨论】:
其实它输出的是“basederivedbase”(在修复//main
之后),你想一想就会明白为什么了。
【参考方案1】:
在执行类C
的构造函数期间,派生的子对象尚未构造。因此,正在构造的对象的动态类型是构造函数的静态类型,即C
。任何virtual
函数都将被分派,就好像对象是C
类型一样。同样,当派生类型的对象被销毁并且C
的析构函数正在运行时,所有派生子对象都已被销毁,并且该类型的行为就像它是C
类型一样。
也就是说,在构造和销毁过程中,涉及继承的对象的类型会发生变化!动态调度被安排来匹配对象的当前类型。
【讨论】:
以上是关于构造函数和析构函数中的虚函数调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
条款09:不要在构造过程和析构过程中调用 virtual 方法