Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟基类初始化_C++_Constructor - Fatal编程技术网

C++ 虚拟基类初始化

C++ 虚拟基类初始化,c++,constructor,C++,Constructor,在寻找标准中某些事实的解释时,我发现: 抽象类(10.4)从来不是最派生的类,因此 构造函数从不初始化虚拟基类,因此 可以省略相应的mem初始值设定项 这来自最终工作草案的段落12.6.2。因为,它被嵌入到Note中,并且没有提供任何示例,所以我不知道应该如何处理它。因此,我尝试了这个例子: #include <iostream> struct B{ ~B(){} B(){ std::cout << "B()" << std::endl; }

在寻找标准中某些事实的解释时,我发现:

抽象类(10.4)从来不是最派生的类,因此 构造函数从不初始化虚拟基类,因此 可以省略相应的mem初始值设定项

这来自最终工作草案的段落
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)