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

时间:2013-09-02 21:08:28

标签: c++ constructor 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;
     }

知道为什么这段代码打印出“base”和“derived”? 我理解建议不是将虚函数调用放在构造函数或析构函数中,我只是想知道为什么上面的代码会有这种行为。感谢

1 个答案:

答案 0 :(得分:4)

在执行类C的构造函数期间,尚未构造派生的子对象。因此,构造对象的动态类型是构造函数的静态类型,即C。将调度任何virtual函数,就好像对象是C类型一样。同样,当派生类型的对象被销毁并且正在运行C的析构函数时,所有派生的子对象都已被销毁,并且类型的行为就像它是C类型一样。

也就是说,在构造和破坏期间,涉及继承的对象的类型会发生变化!动态调度被安排为匹配对象的当前类型。