c++ - 构造函数和析构函数中的虚函数调用

标签 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”吗?
我理解的建议是不要将虚函数调用放在构造函数或析构函数中,我只是想知道为什么上面的代码会有这种行为。谢谢

最佳答案

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

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

关于c++ - 构造函数和析构函数中的虚函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18580779/

相关文章:

c++ - 何时使用虚拟析构函数?

c++ - 是否有任何自动化的方法来实现后构造函数和预析构函数调用虚拟方法?

c++ - 在 Parent Ctor 中绑定(bind)虚函数

C++:数组的构造函数初始化器

c++ - 在 qt (mingw) 中启用 c++1y

基于 JavaScript 文本的宠物游戏

c++ - 在派生类的构造函数中初始化父类(super class)

c++ - 析构函数和python

c++ - Python ctypes : initializing c_char_p()

c++ - [仅等于运算符]在集合中查找重复元素并将它们分组的快速算法是什么?