Ошибка наследования C++: неоднозначная ошибка

В следующем коде я получаю неоднозначную ошибку при вызове D::f в _tmain(..), так как B:: f переопределяет A:: f, указатель на f в A:: vtable указывает на B:: f.

1) Почему компилятор тогда выдает неоднозначную ошибку? Может кто-нибудь, пожалуйста, очистить это?

2) Я попытался перегрузить A::f(int), изменив B::f(int) на B::f(char), но ошибка не исчезла! это почему?

Диаграмма наследования:

............A......
........../.|.\....
........A1..B..C...
..........\.|./....
............D......

Код:

struct A { 

 virtual void f(int x) {cout << "A::f";}; 
 virtual void g(int x) {cout << "A::g";}; 
 private: int n; 
}; 
struct A1: A { 
 virtual void h(int x) {f(x);}; 
}; 
struct B : virtual A { 
 void f(int x) {cout << "B::f";}; 
}; 
struct C : virtual A { 
 void g(int x) {cout << "C::g";}; 
}; 
struct D : A1, B , C { 

};
int _tmain(int argc, _TCHAR* argv[])
{
    D* d = new D();
    d->f(1);
    return 0;
}

1 ответ

Решение

Вам нужно изменить определение наследования для struct A1:

struct A1: virtual A {

Причина алмазного наследства неоднозначна. struct D получает метод f() от обоих A1 а также B, Чтобы наследовать его только один раз, все подходящие классы должны виртуально наследовать метод.

Другие вопросы по тегам