55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
|
||||||
1 | ||||||
Указатель на базовый класс и на производный17.07.2013, 15:38. Просмотров 1523. Ответов 13
Метки нет Все метки)
(
Пытаюсь разобраться с классами и наследованием.
Сама эта задача из Дейтела "Как программировать на C++" Есть базовый класс Точка и у него один наследник Круг. В самой программе определяю две переменных у два указателя на эти классы. Вообщем, если указателю на производный класс присвоить указатель на базовый, то странный вывод. Печатает что радиус равен 0 (я в комментарии показал вывод программы)
Почему второй вывод печатает Радиус = 0.00 ? Почему не мусор? Ведь у точки нет радиуса
0
|
|
17.07.2013, 15:38 | |
Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? Базовый класс Complex и производный класс для реализации квадратных матриц Создать базовый класс Car (машина) и производный класс Lorry (грузовик): ООП ошибки
|
|
![]() 2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
17.07.2013, 15:50 | 2 |
Строго говоря, второй вывод может напечатать все, что угодно. В том числе - ноль. (Ноль тоже относится к понятию "мусор".) Видимо, так звезды встали, что в той ячейке памяти оказался ноль.
"с хабаром вернулся - чудо, живой вернулся - удача, патрульная пуля мимо - везенье, а все остальное - судьба..." (с)
1
|
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
|
|
17.07.2013, 16:04 [ТС] | 4 |
там смысл в том, что круг рассматривается как точка
конечно получается непонятно что, но это чтобы лучше понять наследование
0
|
![]() 2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
17.07.2013, 16:09 | 5 |
Наоборот: точка (ptrPoint) рассматривается как круг (ptrCircle).
Не по теме: Я бы высказался в том смысле, что Дейтел тут свалял дурака. Отношение наследования реализует отношение "является": объект класса-потомка является одновременно и объектом класса-предка, и поэтому может быть подставлен во всех случаях, когда по логике программы требуется объект класса-предка (LSP). Круг же не является точкой.
0
|
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
|
|
17.07.2013, 16:11 [ТС] | 6 |
теперь буду знать. обычно когда переменная содержит мусор, то при выводе показывает огромное положительное или отрицательное число
Добавлено через 1 минуту да у меня от этого уже голова кругом ![]()
0
|
![]() 2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
17.07.2013, 16:13 | 7 |
Не совсем так. "Мусор" может показать что угодно - "огромное" положительное или отрицательное число, или "не очень огромное", или "совсем малюсенькое", или ноль... вообще - что угодно. В прямом смысле слова. Ноль тоже подходит под критерий "что угодно". :-)
1
|
![]() |
|
17.07.2013, 16:16 | 8 |
Ответ на вопрос может стоит поискать в самом компиляторе. Возможно он при приведении типов автоматически обнуляет свободные поля? Проверил: добовил еще одно поле в класс Circle/Та же басня - значение нуль. Значит действительно компилятор при приведении типов обнуляет свободные поля.
1
|
![]() 2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
17.07.2013, 16:21 | 9 |
Нет, он ничего не "обнуляет". Просто - совпадение.....
Кстати, компиль какой? и как транслируешь - в debugили в release ?
0
|
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
|
|
17.07.2013, 16:23 [ТС] | 10 |
я в debug транслирую
visual studio 2010
0
|
Мимино
|
17.07.2013, 16:46
#12
|
Не по теме: Пример не очень удачный, т.к. сложный для понимания, но тем не менее правильный. Круг на плоскости можно представить как точку центра окружности и радиуса (как в примере). Этого достаточно, чтобы вычислить любую точку на окружности. Получается, что по его примеру круг является точкой(началом координат отрезка "радиус") + длина радиуса. А вот следующие примеры с наследником класса Circle - класс Cylindr, который определяется еще и высотой, действительно лажа выходит, т.к. у точки нет z-координаты. Это справедливо только если центры оснований цилиндра лежат в плоскости (x, y)
0
|
CheshireCat
|
17.07.2013, 16:59
#13
|
Не по теме: Ннуууу..... мне, конечно, кажется, что это объяснение "притянуто за уши" (то, что называется "подгонка результата под ответ"), но - ладно, допускаю возможность и такого толкования... Хотя кмк здесь мы имеем в чистом виде отношение агрегирования "включает": круг включает (содержит в себе) точку центра и радиус. Короче, к этим надуманным примерам в книжках от Дейтела/Шилдта/etc. надо относиться изрядно критически.
0
|
17.07.2013, 17:19 | 14 | |||||
Так не стоит делать. Наоборот, без проблем указателю на базовый класс можно присвоить адрес объекта производного класса. То есть, если круг наследуется от точки:
1
|
17.07.2013, 17:19 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Указатели в базовом классе на базовый класс и производный класс Создать базовый класс Triad и производный класс vector3D Создать базовый класс Polygon и производный класс Triangle Наследование: базовый класс Квадрат, производный класс Пирамида Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |