首页 > 解决方案 > 为什么基类的成员不保留它在构造函数中首次初始化的值?

问题描述

#include <iostream>

using namespace std;
class B {

protected:
    int x;
public:
    B() {
        x = 78;
    }

};
class D1 : virtual public B {
public:
    D1() {
        x = 15;
    }

};
class D2 : virtual public B {
public:
    D2() {
        x = 37;
    }


};
class C : public D2, public D1 {
public:
    int get_x() {
        return x;
    }

};
int main()
{
    C ob;
    cout << ob.get_x();
    return 0;
}

创建 C 对象时,x 的值是 15 而不是 78。我想知道是不是因为最后调用的构造函数(更改了 x 的值)是 D1 构造函数?

标签: c++oop

解决方案


我想知道是否是因为最后调用的构造函数(更改了 x 的值)是 D1 构造函数?

是的,这正是发生的事情。类的基本构造函数按照列出祖先的顺序调用。由于D1最后列出,它的构造函数最后被调用。B'首先调用 s 的构造函数初始化x为 78,然后用 37D2覆盖 s 的构造函数,然后用 15覆盖 s 的构造函数。xD1x


推荐阅读