C++ 虚拟基类初始化
在寻找标准中某些事实的解释时,我发现: 抽象类(10.4)从来不是最派生的类,因此 构造函数从不初始化虚拟基类,因此 可以省略相应的mem初始值设定项 这来自最终工作草案的段落C++ 虚拟基类初始化,c++,constructor,C++,Constructor,在寻找标准中某些事实的解释时,我发现: 抽象类(10.4)从来不是最派生的类,因此 构造函数从不初始化虚拟基类,因此 可以省略相应的mem初始值设定项 这来自最终工作草案的段落12.6.2。因为,它被嵌入到Note中,并且没有提供任何示例,所以我不知道应该如何处理它。因此,我尝试了这个例子: #include <iostream> struct B{ ~B(){} B(){ std::cout << "B()" << std::endl; }
12.6.2
。因为,它被嵌入到Note中,并且没有提供任何示例,所以我不知道应该如何处理它。因此,我尝试了这个例子:
#include <iostream>
struct B{
~B(){}
B(){ std::cout << "B()" << std::endl; }
B(int){ std::cout << "B(int)" << std::endl; }
};
struct A : virtual B
{
int s;
virtual void foo() = 0;
A(int a) : B(a) { std::cout << "A(int)" << std::endl; }
};
struct D : A{
D() : A(10){ }
virtual void foo(){ }
} d;
int main()
{
}
尽管在ctor初始值设定项中指定了
B
的构造函数。这就是它们的意思吗?在本例中,D
是派生最多的类,将使用默认(无参数)构造函数构造B
抽象类从来都不是最派生的,因为您必须从它派生才能实例化它。(修改我的注释)是的,我认为您做得对:A(int)
跳过B
的初始化,即使您在ctor初始值设定项中使用了B(A)
。最后调用B
的默认构造函数对其进行初始化。(请注意,您需要virtual~B(){}
)答案应该与此相关。
B()
A(int)