继承共享内存

时间:2017-08-10 21:41:09

标签: c++

我有一个我无法逻辑回答的问题。为什么在我运行以下代码之后:

class foo1
{
private:
    int age;
public:
    foo1(int _age) :age(_age) {}
    void print() { std::cout << age << std::endl; }
};

class foo2 :virtual public foo1
{
    int grade;
public:
    foo2(int _age, int _grade) :foo1(_age), grade(_grade) {}
};


class foo3 :virtual public foo2
{
private:
    int score;
public:
    foo3(int _age, int _grade, int _score) : 
          foo1(_age), foo2(5000, _grade), score(_score) {}
};

int main()
{
    foo3 k(77,2,3);
    k.print();
}

控制台输出是77,而不是5000.我认为5000是正确的输出(但我错了)的原因是,当我使用初始化列表作为foo3的构造函数时,会发生以下情况:

1)foo1的构造函数将年龄设置为77。

2)之后,foo2的构造函数将age设置为5000,将grade设置为2,因为foo2使用foo1的构造函数。

为什么foo2的构造函数不会改变构造函数foo1设置的值

1 个答案:

答案 0 :(得分:4)

虚拟继承类的构造函数始终由派生类最多的类调用。在你的情况下,这是foo3。跳过foo2中foo1的构造函数调用。