![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
maxim1000
это так, но сА иммет виртуальный метод. class cC - не может изменить метод cB. У него должен быть свой метод на сА. |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Ну а кто тебе мешает использовать промежуточный класс
Что же касается вопроса: "Почему?
"Класс не может быть специфирован как прямой базовый класс производного класса более чем одинраз. Примечание: класс может быть косвенным базовым классом более одного раза и может быть прямым и косвенным базовым классом " -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Vyacheslav |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Если каждый раз оглядываться на конкретную реализацию компилятора, то от стандарта ничего не останется.
Интересно, откуда она возмется? По стандарту при таком наследовании создаются две копии TBase А этот код действительно не пройдет.
Тут надо обязательно уточнять:значение Value которой копии TBase нам требуется. Поэтому нужно так
-------------------- С уважением, Вячеслав Ермолаев |
||||||||||
|
|||||||||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Вот-вот. Как укажешь TBase, там-то он и загнется от невозможности решить, из какой же копии брать значение -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Народ, мне вот интересно, а почему никто не вспомнил про виртуальные базовые классы ?
При обычном наследовании (без virtual) схема такова: X ----> Y ----> D <---- Z <---- X При виртуальном - схема наследования будет такова: D<----- Y <---- X +<----- Z <---- + ИМХО, это именно то, что надо спросившему. © Подбельский В.В. "Язык Си++", 1999 Это сообщение отредактировал(а) mr.DUDA - 5.11.2003, 20:38 -------------------- ![]() |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Не вспомнили, потому что вопрос не про виртуальное наследование.
Если говорить про виртуальное наследование, то я вот с чем сегодня столкнулся. Изучая заголовочные файлы VisiBroker'а, обнаружил такую схему наследования: class A { public: virtual void f(); }; class B : virtual public A { public: virtual void f(); }; class C : virtual public B, virtual public A { }; Во-первых, не понятно зачем вообще наследовать С от 2 классов. Это я объясняю тем, что разработчики так "подстраховались" Во-вторых, при компиляции в VC выдаётся предупреждение, что функции A::f() не доступна. |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Я так понимаю, Вы уже со стандартом спорите , а не со мной. И кто интересно загнется? Компилятор? Проверить очень просто. Возьмите компилятор, который поддерживает стандарт, например VC7++ и проверьте, загнется или не загнется А компилятор четко понимает, что TIzvtar::TBase::Value это совсем другое, чем TIzvrat::TDerived::TBase::Value -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Ars |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Можно и на ты Я все-таки иногда проверяю то, что пишу в форум и это как раз один из таких случаев А результаты таковы. Компилим вышеприведенный код под CBuilder6:
Под Visual C++ 6.0:
Т.е. int I=Izvrat->TBase::Value; в двух ведущих компиляторах не проходит. Я не хочу сказать, что это все противоречит принципам ООП, а только то, что это реализовать не получится, да и не нужно, кроме случаев академического программирования -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
||||||
|
|||||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
К сожалению компиляторы С++Builder 6 и Visual C++ 6.0 в данном аспекте не соответсвуют стандарту.
Кстати они далеко не ведущие. Я же указал, надо использовать Visual C++ 7.0. Что касается С++Builder 6, я уже пару дней назад отправил Borland'у bug report за номером 6367.
Что касается чисто академического вопроса, то практически он спокойно решается
При этом фактически отличий от первого варианта нет -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Ну, сдаюсь, сдаюсь.
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |