【问题标题】: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之后),你想一想就会明白为什么了。

标签: c++ constructor virtual-destructor


【解决方案1】:

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

也就是说,在构造和销毁过程中,涉及继承的对象的类型会发生变化!动态调度被安排来匹配对象的当前类型。

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2013-02-18
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2012-01-28
    • 2012-01-28
    • 2011-12-24
    • 2011-04-16
    相关资源
    最近更新 更多