Здравствуйте, гость ( Вход | Регистрация )
kwisp | Дата 4.12.2009, 12:18 |
Litkevich Yuriy, в данном примере ты пытался его заставть преобразовать из типа void* ! dynamic_cast служит не только дял преобразования указателей и ссылок с l-value но и для определения возможно ли преобразование в случае неудачи с указателями возвращает 0 в слкчае неудачи с сылками выкидывает исключение. |
|
Litkevich Yuriy | Дата 3.12.2009, 18:36 |
kwisp, т.е. в обратную сторону он не преобразует (как в данном примере) от наследника к базовому классу? | |
kwisp | Дата 3.12.2009, 18:24 |
вроде синтаксис верный Цитата оператор dynamic_cast поддерживает преобразования типов во время выполнения, обеспечивая безопасную навигацию по иерархии классов. Он позволяет трансформировать указатель на базовый класс в указатель на производный от него, а также преобразовать l-значение, ссылающееся на базовый класс, в ссылку на производный, но только в том случае, если это завершится успешно; Однако для получения информации о типе производного класса операнд любого из операторов dynamic_cast должен иметь тип класса, в котором есть хотя бы одна виртуальная функция. |
|
AD | Дата 3.12.2009, 17:31 |
Я не могу так. Народ, будьте внимательнее. "Странное поведение при множественном наследовании QObject" вместо "Странное повдение при множественном наследовании QObject" P.S. Как то следите хотя бы за названиями тем. Про сообщения я молчу.... Извините, если надоедаю по пустякам.... |
|
Litkevich Yuriy | Дата 3.12.2009, 16:06 |
вот так: Цитата main.cpp:36: error: cannot dynamic_cast `p' (of type `void*') to type `class A*' (source is not a pointer to class) на строчку:
вроде синтаксис верный |
|
kwisp | Дата 3.12.2009, 15:58 |
Litkevich Yuriy, а как послал? |
|
Litkevich Yuriy | Дата 3.12.2009, 15:29 |
как верно пользоваться dynamic_cast<>() я пробовал в его коде такое приведение, компилер меня сразу послал, а вто static_cast и reinterpret_cast работают |
|
kwisp | Дата 3.12.2009, 11:38 |
поддерживаю fgr10, не было бы
не было бы проблем:) кстати в куче учебников и книг просто кричат о том что так делать нельзя. но с другой стороны не было бы и такой интересной и познавательной темы:) еще в данном вопросе полезно узать как верно пользоваться dynamic_cast<>(), ведь она тоже требует наличия виртуальной таблицы. |
|
aljeshishe | Дата 2.12.2009, 21:48 |
Посмотрел как хранится в памяти класс, наследующий виртуально от полиморфного класса и невиртуально от обычного: class User : virtual public QObject, public Node 1. Данные Node 2. Адрес виртуального класса QObject - 4 байта 3. Данные User 4. vtable QObject - 4 байта 5. Данные QObject Таким образом User не содержит первым байтом vtable QObect'a (как при обычном наследовании), поэтому указатели при приведении void* ->Node вычисляются верно |
|
Litkevich Yuriy | Дата 2.12.2009, 20:54 |
виртуальное наследование никогда не слышал про такоеlass User : virtual public QObject, public Node За статью спасибо. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.3.2024, 15:40 |