构造函数和析构函数中的虚函数调用 [英] virtual function calls in constructor and destructor

查看:35
本文介绍了构造函数和析构函数中的虚函数调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

    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.

这篇关于构造函数和析构函数中的虚函数调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆