2013-10-04 1 views
0

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

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

Это не так, как выглядит диаграмма наследования. Это как [это] (http://pastebin.com/ksTpdXZE). – jrok

ответ

4

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

struct A1: virtual A { 

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