Что такое виртуальное наследование в С++

У меня вопрос о виртуальном наследовании в С++:

class A {
};
class B: virtual public A {
};
class C: virtual public A {
};

class D: public B,public C, virtual public A {
};

Если D наследует виртуальное наследование B и C, можно гарантировать наличие только одной копии A, содержащейся в D, но что относительно D наследует A, используя виртуальную публикацию A снова так же, как и код выше?

поэтому количество под-объектов типа A равно 1 или 2?

ОК, спасибо за ответы, я понимаю. Но я все еще путаю какое-то выражение с виртуальным наследованием. например:

#include <iostream>
using namespace std;

class A {
    public:
    A() {std::cout<<"A ";}
};

class B: A {
    public:
    B() {std::cout<<"B ";}
};

class AToo: virtual A {
    public:
    AToo() {
    std::cout<<"AToo ";
}
};

class ATooB: virtual AToo, virtual B {
    public: 
    ATooB() {
    std::cout<<"ATooB ";
}
};

может ли виртуальная машина обеспечить только одну копию A в ATooB? если AToo virtual наследует A, но B не делает, что произойдет? две копии в ATooB? поэтому это означает, что и B, и AToo должны виртуально наследовать A, чтобы сохранить только одну копию внутри ATooB?

Ответ 1

Один - это предполагаемое использование наследования virtual. Существует только одна копия A.

Вы можете проверить это легко. Дайте члену A и измените его с помощью экземпляра D. Если было более одной копии A, компилятор сказал бы, что доступ неоднозначен.

Изменить в отредактированном вопросе будет две копии A. Каждый раз, когда A наследуется регулярно (без virtual), создается новая копия A. Если вам нужна одна копия, объявляйте ее virtual каждый раз.

Ответ 2

Из стандартных документов., 10.1.4,

... Для каждого отдельного базового класса, который указан виртуальным, наиболее производный объектдолжен содержать один подобъект базового класса этого типа.....

И да, только один.