что такое виртуальное наследование в с ++ - PullRequest
10 голосов
/ 06 мая 2011

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

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

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

Если D наследует B, а виртуальное наследование C может гарантировать, что в D содержится только одна копия A, но как насчет 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 наследует A, а B - нет?две копии в ATooB?так что это означает, что и B, и AToo должны виртуально наследовать A, чтобы хранить только одну копию внутри ATooB?

Ответы [ 2 ]

11 голосов
/ 06 мая 2011

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

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

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

4 голосов
/ 06 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...