383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
1 | ||||||
Неоднозначность и multiple inheritance26.10.2013, 23:37. Показов 2001. Ответов 24
Метки нет (Все метки)
Есть такая иерархия и main():
0
|
26.10.2013, 23:37 | |
Ответы с готовыми решениями:
24
Inheritance Generic inheritance. Templates Copy Constructor Question .Generic inheritance. Templates Templates. (concrete inheritance). question to destructor implementation |
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
|
26.10.2013, 23:42 | 2 |
менять можно только класс MI?
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
26.10.2013, 23:56 [ТС] | 3 |
Да. Так в упражнении в книге написано.
Добавлено через 12 минут Единственное к чему я пришел - это добавить функцию MI:: print(string); но это неправильно с точки зрения ООП: ведь по логике нужно вызвать именно Base:: print(string); Я в недоумении уже долго
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
|
26.10.2013, 23:56 | 4 |
Вообще было бы неплохо сделать наследование Base виртуальным ( у Derived1 и Derived2 ). Потом дописать в MI using Base:rint и все будет работать
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
27.10.2013, 00:16 [ТС] | 6 | |||||
Как изменить определение класса MI, чтобы этот фрагмент компилировался и выполнялся правильно?
Спаибо, это сработало. Да и нужды в директиве нет - ведь подобъект типа Base теперь только один. Добавлено через 1 минуту Исправленный вариант, может кому пригодится:
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
27.10.2013, 00:20 [ТС] | 7 |
P.s. Это задание было перед началом раздела "Виртульное наследование". Видимо так авторы решили "подшутить" над читателем - ведь мне еще не было известно про эту возможность. Поломайте голову, новички, полезно
0
|
Каратель
|
|
27.10.2013, 00:22 | 8 |
с такой формулировкой можно:
1) просто MI унаследовать от Base 2) реализовать в MI соответствующую перегрузку для string виртуальное наследование не подходит под такую формулировку задания
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
27.10.2013, 00:26 [ТС] | 10 |
Сам не понимаю, это, нверное, такой прикол от авторов. Как подготовка перед следующим этапом.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
27.10.2013, 00:35 [ТС] | 12 |
Стенли Липпман, Жози Лажойе "C++ Primer" 3rd Edition.
Глава 18, Упр. 18.12 (сразу же перед разделом "Виртуальное наследование").
0
|
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
||||||
27.10.2013, 01:06 | 13 | |||||
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
27.10.2013, 03:10 [ТС] | 15 |
нее, так тоже неоднозначность: функции какого подобъекта вводить в область видимости MI: Derived1::Base или Derived2::Base ?
Да уж, действительно странно. У меня GCC 4.8.2 тоже ругается. Вот незадача
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||
27.10.2013, 03:34 | 16 | |||||
Без написания собственной функции не обойтись, так как иначе имя print базового класса всегда будет скрыто.
Тут вначале мы приводим указатель к базовому классу Derived1, устраняя неоднозначность в иерархии наследования, а затем явным квалификатором получаем доступ к сокрытому имени.
1
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
27.10.2013, 04:01 | 17 | |||||
какой еще динамический каст. во первых - он не должен работать при отсутствии чего-нибудь виртуального.
во вторых - зачем динамический каст когда можно статический. в третьих зачем каст, когда можно задать область из какой области видимости использовать принт внутри такой функции. и в четвертых, зачем такая функция, когда это можно сделать и во внешнем по отношению к классу коде:
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
27.10.2013, 04:42 | 18 |
Прочитай постановку задачи.
И покажи мне пункт стандарта, который запрещает мне использовать dynamic_cast в данном случае (хоть и нет полиморфности). Но да, static_cast тоже можно использовать. Добавлено через 13 минут В общем добавлю, что при простом приведении объекта производного класса к непосредственному базовому, dynamic_cast работает не только с полиморфными типами. Более того, тут нет RTTI, а поэтому именно в данном случае нет никакого отличия от static_cast, даже в скорости.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
27.10.2013, 05:24 [ТС] | 19 |
Вот это навернули)) И изменили только класс MI, и без виртуального наследования обошлись.
Не по теме: P.s. sorry за подсветку синтаксиса Qt, она мне больше нравится)
0
|
Каратель
|
|
27.10.2013, 11:58 | 20 |
0
|
27.10.2013, 11:58 | |
27.10.2013, 11:58 | |
Помогаю со студенческими работами здесь
20
Неоднозначность декларации Виртуальная неоднозначность неоднозначность, explicit Неоднозначность при наследовании Неоднозначность переменной count Неоднозначность при множественном наследовании Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |