我有一个我无法逻辑回答的问题。为什么在我运行以下代码之后:
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设置的值
答案 0 :(得分:4)
虚拟继承类的构造函数始终由派生类最多的类调用。在你的情况下,这是foo3。跳过foo2中foo1的构造函数调用。