![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ситуация такова:
класс1 / \ класс2 класс3 \ / класс4 указатель на класс 1(по типу) нужно поставить на класс4 соответственно компилятор не знает через какую ветку это ему делать ...как бы ему это сообщить??? |
|||
|
||||
| Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
Используйте виртуальное наследование.
|
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
так и сделано ...но дело в том что имеется массив указателей на класс 1 и нужно чтобы можно было указать на все классы ...т.к они производные.
то есть этот массив будет хранить указатели на все объекты этой иерархии |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
1. static_cast, если известно что тип соответсвует,
2. dynamic_cast с проверкой соответсвия в рантайме 3. организовать архитектуру с сопоставлением иерархии объектов к иерархии операций, подробнее в поиске по "двойная диспетчеризация" Добавлено через 1 минуту и 27 секунд тип наследования (ромбовидный) к проблеме не относится.. Это сообщение отредактировал(а) mes - 3.11.2010, 00:48 |
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
static помог спасибо
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
чтоб быть уверенными что он помог правильно, разберитесь внимательно когда нужно использовать статик_каст, а когда диамик_каст.. |
|||
|
||||
| fuckingniger |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
declaration of 'worker'
почему такая ошибка ?...ведь вроде бы всё правильно написано worker_procent_of_sum наследник worker и почему тогда он не полтиорфный ??? |
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
полиморфным класс становится при наличии хотя бы одной виртуальной функции ( в том числе и виртуального деструктора)..
|
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
а dynamic_cast только к полиморфным можно применять? чем простые хуже?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
то есть если я щас возьму сделаю 1 полиморфную функцию в worker то всё заработает?
Добавлено через 3 минуты и 1 секунду и правда ошибки не стало ...чудеса да и только |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
насчет всего не знаю, но эта ошибка пропадет .. Это сообщение отредактировал(а) mes - 3.11.2010, 02:03 |
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
извините, что столько вопросов, но не клеится что-то сегодня .
имеется массив указателей на класс1 под названием workers я при помощи static_cast преобразую указатель на класс4(из 1 поста) к классу1(чтоб хранить можно было в массиве) а потом для вызова специфических функций класса 4 делаю обратное преобразование при помощи dynamic_cast . вылетает след ошибка : |
|||
|
||||
| Леопольд |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Обратного неявного преобразования нет, поэтому нужно указывать static_cast. Однако, это "опасное" действие, потому что можно сделать так:
Добавлено @ 08:24 Возможно, выскакивает std::bad_cast (правда он возникает когда приводишь ссылки, а не указательи). http://cplusplus.com/reference/std/typeinfo/bad_cast/ Поведение dynamic_cast не очень очевидно. В случае с указателями, исключения не возникает, но указатель устанавливается в NULL. В случае с ссылками, вылетает исключение bad_cast (просто потому что ссылку нельзя установить в NULL)
Это сообщение отредактировал(а) Леопольд - 3.11.2010, 08:41 -------------------- вопросов больше чем ответов |
||||||||||
|
|||||||||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |