gpt4 book ai didi

C++ 初始化列表忽略调用父类构造函数

转载 作者:行者123 更新时间:2023-11-28 03:08:05 25 4
gpt4 key购买 nike

在接下来的代码中,构建 C 类首先初始化 A,然后是 B1,然后是 B2,最后是 C 类。但是,在初始化 B1 和 B2 时,调试器忽略了 A(1) 和 A(2) 的初始化(按顺序出现在 B1 和 B2 的初始化列表中)但没有忽略 B2(3) 的初始化在 C 初始化列表中。

这是为什么?

提前致谢。

代码如下:

struct A { 
int i;
A() { i = 0; }
A(int _i) : i(_i) {}
virtual void f() { cout << i; }
};

struct B1 : virtual A {
B1() : A(1) { f(); }
void f() { cout << i+10; }
};

struct B2 : virtual A {
B2(int i) : A(2) { f(); }
};

struct C : B1, B2 {
C() : B2(3) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
C* c = new C();
return 0;
}

最佳答案

对于virtual 基类,最派生的类必须提供构造函数参数,例如:

struct C
: B1, B2 {
C()
: A(17)
, B2(3) {}
};

如果最派生类在它的初始化列表中没有提到virtual基类,则使用virtual基类的默认构造函数(如果没有,则为一个错误)。

这样做的原因是为了避免混淆哪个派生类应该为共享的虚拟基提供构造函数参数:最派生的类最了解实际需要什么。

关于C++ 初始化列表忽略调用父类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199258/

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