2016-05-15 2 views
0

Как работает множественное наследование при использовании виртуального базового класса? Как мы знаем, когда и где мы должны использовать виртуальный базовый класс?Как работает множественное наследование при использовании виртуального базового класса?

Для получения следующего кода, как мы можем получить результат?

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

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

class C: public B { 
    public: 
     C() { 
      cout<<"\t C"; 
     } 
}; 

class D: virtual C { 
    public: 
     D() { 
      cout<<"\t D"; 
     } 
}; 

class E: virtual C, virtual D { 
    public: 
     E() { 
      cout<<"\t E"; 
     } 
}; 

class F: public B, virtual E { 
    public:  
     F() { 
      cout<<"\t F"; 
     } 
}; 

int main() { 
    F obj; 
} 

Выход:

 A  B  C  D  E  A  B  F 

Я получаю предупреждение [Предупреждение] прямая база 'B' недоступен в 'F' из-за неоднозначности [по умолчанию включено]

Как Я исправляю это ??

+0

Я бы сначала рассмотреть редизайн –

+2

Какой выход вы хотите получить? Как «исправить это» зависит от того, что вы пытаетесь выполнить. – interjay

+1

Виртуальное наследование применяется только от уровня, который он впервые вводил. Так как ни 'C', ни' D' наследуют практически, вы все равно получаете дубликаты баз и двусмысленности, когда вы наследуете от обоих (даже практически). – StoryTeller

ответ

2

Вы пропустили virtual в следующих декларациях (см замечание рассказчика):

class B: public virtual A {...}; 
class C: public virtual B {...}; 
class F: public virtual B, virtual E {...}; 

Вот демо: http://cpp.sh/6k2be