2013-03-01 6 views
0

Предположим, ситуация.Повторное наследование. Неограниченный

struct Top 
{ 
    int x; 
}; 

struct Left : public Top 
{}; 

struct Right : public Top 
{}; 

struct Bottom : public Left, public Right 
{ 
    void foo() 
    { 
    Left::x; // Normal compiled 
    } 

    void goo() 
    { 
    Left::Top::x; // error: ‘Top’ is an ambiguous base of ‘Bottom’ // Why --- ???? 
    } 
}; 

Может ли кто-нибудь объяснить мне, почему в функции goo() компилятор дает ошибку неоднозначности?

Я написал void foo(), чтобы показать, что если я получаю x от классификатора Left :: x; нет никакой двусмысленности, поэтому почему, когда я использую более подробный классификатор доступа Left :: Top :: x; появляется двусмысленность?

+0

Кстати, я пробовал этот код в visual studio 2012 (настройки компилятора по умолчанию) и скомпилировал его. Но gcc - 4.6 (ubuntu) дает эту ошибку. Так как я понимаю, что это проблема gcc-4.6, или ??? Я не знаю, если кто-то что-то знает об этом, напишите ответ. –

ответ

0

Ваша проблема известна как «Проблема с алмазами» на языках ООП. Помните, что :: просто подсказывает, где найти что-то, а не как явно принять это. В методе foo вы ссылаетесь на x, который известен слева. Пока что это охкай. Но в методе goo ваше высказывание «получите x>, которое известно Top <, которое известно слева». Но эта ссылка не меняет того факта, что ваш класс Right также знает класс Top. Итак, в вашем случае Left :: Top :: x - это то же самое, что и запись Top :: x. И результат в том, что это неоднозначно, что вам нужно, чтобы тот наследовал Левый, или тот, который был прав. Разумеется, в вашем случае это всего лишь один тип, где компилятор не мог работать с большим количеством проблем. Но это правило генерала, и такой материал может быстро стать довольно странным;)

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

  • Нет связанных вопросов^_^