Название: Перекрестное преобразование. Dynamic_cast. Отправлено: Pupil от Сентябрь 30, 2014, 09:45 При изучении примера Перекрестного преобразования типа между производными классами одного базового класса из книги Павловской том 1 написано, что
Цитировать Классы С и D являются производными от класса В. Функции demo передается указатель на класс D, являющийся на самом деле указателем на «братский» для него класс С, поэтому динамическое преобразование типа из D в С в функции demo завершается успешно. У меня функция demo выдает false, т.е. неудачу кастования. Вопрос: Сбой на этапе неявного преобразования типа С в тип D при передаче в функцию demo или Кастомщик не может тип С преобразовать в D? Код: #include <QtCore/QCoreApplication> Или данный вид преобразования невозможен как написано в http://www.cplusplus.com/doc/tutorial/typecasting/ (http://www.cplusplus.com/doc/tutorial/typecasting/), т.е. конвертации классовые конвертации только от базового к дочернему и обратно? Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Igors от Сентябрь 30, 2014, 10:19 Нет, не только к родителю и обратно, "бегать по веткам" (кросс-приведение) должно работать. Проверьте включено ли RTTI в опциях компилятора.
[/off] Код: if(c) {c->f2(); std::cout << "it executed" << std::endl;} Код
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Pupil от Сентябрь 30, 2014, 10:51 Igors, при проверке включен или выключен RTTI командой
Цитировать typeid . Она срабатывает. Верно ли в таком случае, что rtti ключен? В файле pro добавил: Код: CONFIG += rtti Результат не изменился. Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Swa от Сентябрь 30, 2014, 11:31 Специально нашёл эту книгу и главу из которой вы взяли пример и скорее всего в книге ошибка.
Оператор dynamic_cast может осуществлять преобразование из базового в дочерний класс или наоборот, но не может преобразовывать "братские" классы потому что они не находятся в одной иерархии. Однако это преобразование можно сделать используя приведение в стиле С: Код: (D*)b Почитайте вот эту тему (http://forum.sources.ru/index.php?showtopic=384747), там тоже обсуждают ваш пример. Вообще, выбросите эту книгу. Читайте Прату или Страуструпа. На худой конец Шилдта. Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: OKTA от Сентябрь 30, 2014, 12:08 А не вот это имелось ввиду под перекрестным преобразованием?
Код
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Igors от Сентябрь 30, 2014, 12:40 Оператор dynamic_cast может осуществлять преобразование из базового в дочерний класс или наоборот, но не может преобразовывать "братские" классы потому что они не находятся в одной иерархии. Только что проверил пример на icc 12.1 - успешно приводит. А вот MSVC 2012 нет. Зависит от компилятораОднако это преобразование можно сделать используя приведение в стиле С: Это выглядит как static_cast, т.к. можно проверить и на компиляции. И не постесняюсь спросить: а какое "простое"? Т.е. в чем оно заключается?Код: (D*)b А не вот это имелось ввиду под перекрестным преобразованием? Ну так точно C * не получить т.к. создавался D Код
А если более практично, то вот так сработает всегда и везде Код
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: OKTA от Сентябрь 30, 2014, 12:46 Получить получить, D ведь и B и C в себе содержит.
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Pupil от Сентябрь 30, 2014, 12:47 Igors, D->B->C. Верно?
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Swa от Сентябрь 30, 2014, 12:58 Только что проверил пример на icc 12.1 - успешно приводит. А вот MSVC 2012 нет. Зависит от компилятора Первый раз такое слышу.Даже Алёна (http://alenacpp.blogspot.ru/2005/08/c.html) говорит, что так нельзя делать. И не постесняюсь спросить: а какое "простое"? Т.е. в чем оно заключается? Имелось в виду без проверки типов, которую делает dynamic_castНазвание: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: OKTA от Сентябрь 30, 2014, 13:04 А если более практично, то вот так сработает всегда и везде Код
Так тоже не будет работать для первоначального примера. Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Igors от Сентябрь 30, 2014, 15:18 Получить получить, D ведь и B и C в себе содержит. Виноват, не увидел множественного наследования (и за что его ругают?). Да, так приводит даже MSVC - остальное можно не проверять. Первый раз такое слышу. Тоже мне бабский авторитет :) Но ведь в примере OKTA "С" не является ни потомком ни родителем "B" - но приводится. Помню неск лет назад была почти такая же тема - и у меня "вбок" работалоДаже Алёна (http://alenacpp.blogspot.ru/2005/08/c.html) говорит, что так нельзя делать. А если более практично, то вот так сработает всегда и везде Код
Так тоже не будет работать для первоначального примера. Igors, D->B->C. Верно? Да. Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: OKTA от Сентябрь 30, 2014, 15:32 Igors, покажи код, который проверял на трех компиляторах. На mingw у меня отказывается работать.
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Pupil от Сентябрь 30, 2014, 15:41 Igors, Спасибо!
Название: Re: Перекрестное преобразование. Dynamic_cast. Отправлено: Igors от Октябрь 05, 2014, 10:37 Igors, покажи код, который проверял на трех компиляторах. На mingw у меня отказывается работать. Код Проверял на gcc 4.2, icc 12.1 и MSVC 2012 |