gpt4 book ai didi

c++ - 为什么在派生类的初始化列表中显式调用虚拟基类构造函数的规则,当一个更老的祖先已经拥有它时?

转载 作者:太空狗 更新时间:2023-10-29 21:37:19 25 4
gpt4 key购买 nike

<分区>

以下代码:

#include<iostream>
using namespace std;

class Man
{
int stories;

public:
Man(int stories) : stories(stories) {cout << "A man is created with " << stories << " stories." << endl;};
};

class Grandpa : public virtual Man
{
int pipes;

public:
Grandpa(int stories, int pipes) : Man(1000), pipes(pipes)
{
stories += stories;
cout << "Grandpa is created with " << stories << " stories and pipes." << endl;
};
};

class Father : public Grandpa
{
int cars;

public:
Father(int stories, int cars) : Man(1000), Grandpa(1000, 1), cars(cars)
{
stories += stories;
cout << "Father is created with " << stories << " stories and cars." << endl;
};
};

class Son : public Father
{
int girls;

public:
Son(int stories, int girls) : Man(1000), Father(1000, 3), girls(girls)
{
stories += stories;
cout << "Son is created with " << stories << " stories and girls." << endl;
};
};

int main()
{
Son Dick(1000, 5);
return 0;
}

在运行时给出以下输出:

人是有 1000 个故事造就的。

爷爷是用2000个故事和 pipe 创造出来的。

父亲创造了 2000 个故事和汽车。

儿子是用 2000 个故事和女孩创造的。

当我不在父子的初始化列表中调用 Man(int) 时,它不会编译。它试图调用 Man(void),而 Man() 未定义。为什么会这样?然而,我认为,当父子的构造函数被调用时,虚拟基地的构造函数已经在爷爷中被调用了!此外,我希望输出为:

人是有 1000 个故事造就的。

爷爷是用2000个故事和 pipe 创造出来的。

父亲创造了 3000 个故事和汽车。

儿子是用 4000 个故事和女孩创造的。

然后概括一下:为什么必须在派生类的初始化列表中显式调用虚基类构造函数,尽管它已经放在较年轻的祖先初始化列表中?为什么在小祖宗中貌似没有调用,而是尝试调用一个默认的基类?

由于找到数字问题的答案而编辑真可惜 :) 我应该在 Grandpa protected int _stories; 中制作 int stories 然后输出会如预期的那样:Man 1000 个故事,Grandpa 2000 个,3000 个对于父亲和 4000 对于迪克 :) 否则 stories += stories 作用于局部变量而不是 Man 的成员...抱歉打扰了!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com