Общие сведения о виртуальных базовых классах и вызовах конструкторов

Я немного запутался в том, как работают виртуальные базовые классы. В частности, мне было интересно, как вызывается конструктор базового класса. Я написал пример, чтобы понять это:

#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?

13
задан Cœur 12 July 2018 в 15:30
поделиться