构造函数和析构函数中的虚函数调用
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;
}
知道为什么这段代码会打印出基础"和派生"吗?
我明白建议不要将虚函数调用放在构造函数或析构函数中,我只是想知道为什么上面的代码会有这种行为.谢谢
Any idea why this code prints out "base" and "derived"?
I understand the advice is not to put virtual function calls inside constructor or desctructor, I just want to know why the above code would have the behaviour. Thanks
推荐答案
在执行类 C
的构造函数期间,尚未构造派生的子对象.因此,正在构造的对象的动态类型是构造函数的静态类型,即C
.任何virtual
函数都将被分派,就好像对象是C
类型一样.同样,当派生类型的对象被销毁并且 C
的析构函数正在运行时,所有派生的子对象都已经被销毁,并且该类型的行为就好像它属于 类型一样C
.
During execution of the constructor of a class C
, the derived subobjects are not, yet, constructed. Thus, the dynamic type of the object under construction is the static type of the constructor, i.e., C
. Any virtual
function will be dispatched as if the object is type C
. Likewise, when an object of a derived type is destroyed and the destructor of C
is being run, all the derived subobjects are already destroyed and, again, the type behaves as if it is of type C
.
也就是说,在构造和销毁过程中,涉及继承的对象的类型发生了变化!动态调度被安排为匹配对象的当前类型.
That is, during construction and destruction the type of an object involving inheritance changes! The dynamic dispatch is arranged to match the current type of the object.
相关文章