我对虚拟基类的工作原理有点困惑。特别是,我想知道如何调用基类的构造函数。我写了一个例子来理解它:
#include <cstdio>
#include <string>
using std::string;
struct A{
string s;
A() {}
A(string t): s(t) {}
};
struct B: virtual public A{
B(): A("B"){}
};
struct C: virtual public A {};
struct D: public B, public C {};
struct E: public C, public B {};
struct F: public B {};
int main(){
D d;
printf("\"%s\"\n",d.s.c_str());
E e;
printf("\"%s\"\n",e.s.c_str());
F f;
printf("\"%s\"\n",f.s.c_str());
B b;
printf("\"%s\"\n",b.s.c_str());
}
哪个输出
""
""
""
"B"
我不确定前两种情况会发生什么,但对于第三种情况,我至少期待输出为“B”。所以现在我只是感到困惑。了解如何调用A的构造函数的规则是什么?
答案 0 :(得分:9)
总是只有一个构造函数调用,并且始终是您实例化的实际具体类。 你的责任赋予每个派生类一个构造函数,如果需要,就像在B
的构造函数中那样调用基类的构造函数。
更新:很抱歉错过了你的要点!感谢ildjarn。
但是,您的B
从A
继承了虚拟。根据标准(FIDS中的10.1.4),“对于指定为virtual的每个不同的基类,最派生的对象应包含该类型的单个基类子对象”。在您的情况下,这意味着在构建基础时,您的班级F
会立即调用A
的默认构造函数,而不是B
。
答案 1 :(得分:7)
虚拟基类始终由最派生的类构建。