Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямое и непрямое наследование, при множественном наследовании 
:(
    Опции темы
Vyacheslav
Дата 29.12.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Навеяно спорами о "страшной глючности" Builder. 
http://forum.vingrad.ru/topic-75462.html
Залез я Quality Central (года два уже не лазил) и посмотрел состояние дефектов, которые в свое время им выкатил. Один  они пофиксили, второй  у них на очередном build не проявился, а третий - они отрежектили. А касается он множественного наследования. 
Цитата

Behaviour of the compiler differs from ANSI C++ standard
10.1 Multiple base class
...
3..The class can be not specified as direct base class of the derived class more then once. [Note: class can be an indirect base class more then once and  CAN BE DIRECT AND INDIRECT BASE CLASS . ... 

Ключевая фраза здесь  DIRECT AND INDIRECT BASE , то есть я имею право унаследовать  от базового класса более чем один раз и при этом один раз непосредственно
Код

struct A 
{
   int val;
   A(){val = 1;}
};

struct B : public A
{
    B():A(){val = 2;}
};

struct C: public B, public A  // DIRECT AND INDIRECT BASE CLASS 
{
    // C() :B(),A(){}    [C++ Error]  Unit1.cpp(17): E2312 'A' is not an unambiguous base class of 'C'
        C(){};
};

int main(int argc, char* argv[])
{

C c;
// int i =  c.A::val;   [C++ Error] Unit1.cpp(29): E2316 'A' is not a member of 'C'
// int i =  c.val;       [C++ Error] Unit1.cpp(29): E2014 Member is ambiguous: 'A::val' and 'A::val'
int j =  c.B::val;
return 0;
}


В результате компилятор не позволил 
1)явно вызвать конструкторы базовых классов в списке инициализации C() :B(),A(){} 
2)не дал  обратиться с члену val, который унаследован прямо от A c  указанием полной спецификации   int i =  c.A::val
3) и ( это уже от отчаяния smile  ) не дал обратиться    просто   c.val. В этом случае я на него не в обиде. Здесь компилятор прав.

Зато спокойно (как и положено ) дает доступ к val, пришедшей с B

Есть комментарий
Цитата

David Dean at 12/27/2005 11:13:46 AM - [Reply to this comment]  
FWIW, Comeau doesn't compile your code either:

"qc6367.cpp", line 22: error: base class "A" is ambiguous
   int i =  c.A::val;   //[C++ Error] Unit1.cpp(29): E2316 'A' is not a member of 'C'
            ^

"qc6367.cpp", line 23: error: "C::val" is ambiguous
   i =  c.val;      //[C++ Error] Unit1.cpp(29): E2014 Member is ambiguous: 'A::val' and 'A::val'
          ^

То есть Comeau поступил аналогично. 
Дефект отрежектили как  некорректный. 
Я неправильно трактовал стандарт? 
Любопытно, как в этом случае поступают другие компиляторы?





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Xenon
Дата 29.12.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



VS 2005
Код

warning C4584: 'C' : base-class 'A' is already a base-class of 'B'
        see declaration of 'A'
        see declaration of 'B'
error C2535: 'C::C(void)' : member function already defined or declared //ну это понятно почему - потому что тупо скопировал
        see declaration of 'C::C'
error C2374: 'i' : redefinition; multiple initialization //из той же серии
        see declaration of 'i' 
error C2385: ambiguous access of 'val' 
        could be the 'val' in base 'A'
        or could be the 'val' in base 'A'


Это если тупо скопировать и расккомментировать код. 

Это сообщение отредактировал(а) Xenon - 29.12.2006, 16:53


--------------------
user posted image  
PM MAIL   Вверх
Vyacheslav
Дата 29.12.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Xenon @  29.12.2006,  16:48 Найти цитируемый пост)
Это если тупо скопировать и расккомментировать код. 


надо было убрать C(){};

и раскоментарить 

C() :B(),A(){}    
и
int i =  c.A::val




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Xenon
Дата 30.12.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Vyacheslav, ну все равно все понятно. 


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.