Russian Qt Forum
Апреля 23, 2025, 23:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 9 10 [11] 12 13   Вниз
  Печать  
Автор Тема: Как писать ООП программы?  (Прочитано 90524 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #150 : Февраля 28, 2014, 18:43 »

Потому как базовый класс Shape не знает метода setRadius()
И по логике, не обязан, ибо не у всех фигур есть радиус Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #151 : Февраля 28, 2014, 18:48 »

Потому как базовый класс Shape не знает метода setRadius()
То конечно хороший вопрос, но пусть сначала вынесет генерацию из конструктора и хоть как-то наладит взаимодействие классов. А то пока только песиков наводит.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #152 : Февраля 28, 2014, 18:50 »

Пусть учится
Записан
8Observer8
Гость
« Ответ #153 : Февраля 28, 2014, 18:54 »

Получается, что при передачи в функцию через указатель на базовый класс полиморфизм работает, а если в том же блоке, то нет? Непонятно...
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #154 : Февраля 28, 2014, 18:58 »

...а если в том же блоке...
что в том же блоке?
Записан
8Observer8
Гость
« Ответ #155 : Февраля 28, 2014, 19:05 »

Я имею виду, что объявляем указатель на базовый класс и инициализируем его объектом производного:

Код
C++ (Qt)
   std::shared_ptr<myShapes::Shape> pc(new myShapes::Circle(50.0));
   pc->setRadius(25.0);
 

И это не работает. А если так же с функцией, то работает:

Код
C++ (Qt)
void Viewer::draw(std::shared_ptr<myShapes::Shape> ps, int xOffset, int yOffset)
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #156 : Февраля 28, 2014, 19:21 »

А если так же с функцией, то работает:
Да ладно. Подмигивающий
Попробуйте там вызвать setRadius.

Если вы хотите пользоваться частным (не общим) функционалом производного класса, то придется приводить указатель к этому классу.
« Последнее редактирование: Февраля 28, 2014, 19:25 от Old » Записан
8Observer8
Гость
« Ответ #157 : Февраля 28, 2014, 19:50 »

Значит, я полиморфизм неправильно понял. Видимо, перепутал с ситуацией, когда в производном переопределяется функция с ключевым словом "virtual".

Статический полиморфизм (с шаблонами) пока в сторону. Нужно лучше динамический проработать.

А как привести?

Код
C++ (Qt)
(myShapes::Shape)pc->setRadius(25.0);
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #158 : Февраля 28, 2014, 19:53 »

А как привести?
std::dynamic_pointer_cast<T>( ptr );

И лучше сишные касты оставить для си.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #159 : Февраля 28, 2014, 20:02 »

А как привести?
std::dynamic_pointer_cast<T>( ptr );

И лучше сишные касты оставить для си.

Правило 27 Улыбающийся
Цитировать
Предпочитайте приведения в стиле C++ старому стилю. Их легче увидеть, и они более избирательны.
Записан