2014-01-18 2 views
2

В C++ множественное наследование с виртуальной базой Я понимаю, почему этот код может быть неоднозначным, но почему он все еще жалуется, когда я специально вызываю метод производного класса?множественное виртуальное наследование в C++ жалуется на вызов определенной функции

class A { 
public: 
    virtual void f() { cout << 1 ;} 
}; 
class B :virtual public A { 
public: 
    virtual void f() { cout << 2; } 
}; 
class C :virtual public A { 
public: 
    virtual void f() { cout << 3; } 
}; 
class D : public B, public C {}; 

void main(){ 
    D* d = new D(); 
    d->B::f(); 
    getch(); 
} 

я бы ожидать, что он будет работать B: F() метод, но я получаю: «неоднозначное наследие Пустоты A :: f (пустоте) '

+1

Вы испытываете то, что известно как 'Алмазные Наследование задаче' .. http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem – Brandon

+0

Это то, что вы пытаетесь назвать это специфическая функция не фиксирует сам класс D. – Mat

+1

@OP, я просто подумал, что хочу указать на это. 'Main' в C и C++ - НИКОГДА' void'. Пожалуйста, измените его, чтобы вернуть 'int'. Меня это действительно беспокоит. – Brandon

ответ

1

проблема заключается в том, что функция является виртуальной, которая означает, что он замещает адрес в таблице виртуального. Вы не можете переопределить один адрес с двумя функциями. Без virtual классификатора во время звонка будет просто двусмысленность, которой можно избежать го, как ты задания базового класса B::f()

Смежные вопросы