Ошибка наследования 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;
}

0

Решение

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

struct A1: virtual A {

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

4

Другие решения

Других решений пока нет …