构造函数和析构函数中的虚函数调用

2021-12-30 00:00:00 constructor c++ virtual-destructor
    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.

相关文章