Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: dynamic_cast и VC6.0(.NET)  (Прочитано 21109 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Pu
Большой босс

ru
Offline Offline
78


« : 26-08-2003 11:42 » 

Вот пример из MSDN
class B { ... };
class D : public B { ... };
void f()
{
   B* pb = new D;                     // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast<D*>(pb);      // ok: pb actually points to a D
   ...
   D* pd2 = dynamic_cast<D*>(pb2);   // pb2 points to a B not a D
                                    // cast was bad so pd2 == NULL
}

при попытке выполнить пример в первом случае преобразование также  заканчивается неудачно. Может кто объяснит в чем тут дело ? A?
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Serega
Гость
« Ответ #1 : 26-08-2003 12:18 » 

тип B должен быть полиморфным, т.е. должна быть хотя бы одна виртуальная функция, иначе RTTI не сможет никак определить тип (Страуструп 15.4.1)

Такде можно наследовать виртуально
class D : public virtual B {}

суть в том чтобы была таблица виртуальных функций куда можно было бы добавить также и информацию о типе
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 26-08-2003 12:19 » 

Да как раз сейчас перечитывал полиморфизм под СОМ...
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #3 : 26-08-2003 12:22 » 

не лучшая технология  Ха-ха-ха ( оффтопик )
и полиморфизм в COM по моему не имеет отношения с полиморфизму в C++
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #4 : 26-08-2003 12:24 » 

а деструктор катит за виртуальную функцию?
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 26-08-2003 12:26 » 

Цитата

не лучшая технология  ( оффтопик )
и полиморфизм в COM по моему не имеет отношения с полиморфизму в C++

Может и не лучшая, но технология полиморфизма подразумевает включение класса и скрытие его от взоров пользователя класса, в этом случае то же самое происходит...

Не знаю - по моему дестркуктор не покатит.
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #6 : 26-08-2003 12:27 » 

безусловно, если собрался использовать полиморфизм в первую очередь сделай виртуальным деструктор, так ты гарантируешь правильное уничтожение обьекта в любом случае
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 26-08-2003 12:28 » 

А что деструктор не был виртуальным??? По моему вопрос хватит ли одного деструктора, ИМХО нет.
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #8 : 26-08-2003 12:29 » 

полиморфизм подразумевает скрытие реализации, т.к. клиенту не известно (а скорее не интересно) о конкретном типе

я не понял что такое включение класса, возможно мы говорим об одном и том же
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #9 : 26-08-2003 12:30 » 

Ну дак вот - преобразование нулевое и получается - соответственно в ехцепшен(все по описанию).
полный пример:
class B
{
public:
   B(){};
   virtual ~B(){};
   virtual void A(){};
};

class D : public virtual B
{
public:
   D(){};
   virtual ~D(){};
};

int _tmain(int argc, _TCHAR* argv[])
{
   B *pb = new D();
   D* pd = dynamic_cast<D*>(pb);
   delete pd;
   return 0;
}
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 26-08-2003 12:41 » 

Serega, я имею ввиду что СОМ интерфейс по технологии полностью включает все методы родительского класса. Может их использовать...
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #11 : 26-08-2003 12:42 » 

ты в чем пишешь ?
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #12 : 26-08-2003 12:45 » 

vc++.net (в заголовке же все указано - а этот глюк еще давно поймал под vc6) .
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #13 : 26-08-2003 12:47 » 

Странно - действительно глюк...
Я счас тестирую под 6.0

Мож я что то не понял...

Распиши принципы ...
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #14 : 26-08-2003 12:48 » 

в vs.net у меня такой warn

warning C4541: 'dynamic_cast' used on polymorphic type 'B' with /GR-; unpredictable behavior may result

что собственно и происходит

щас попробую найти что такое /GR
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #15 : 26-08-2003 12:51 » 

По моему нашел, при компиляции выдается вот такой Worning - вот описание...

warning C4541: 'dynamic_cast' used on polymorphic type 'class B' with /GR-; unpredictable behavior may resul
---------------------------------------

Описание в MSDN

'identifier' used on polymorphic type 'type' with /GR-; unpredictable behavior may result

You tried to use a feature that requires run-time type information without enabling run-time type information. Recompile with /GR.
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #16 : 26-08-2003 12:54 » 

/GR оказывается это флаг для RTTI, соответственно /GR- значит не юзать RTTI
так что как говорится результат на лице
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 26-08-2003 12:55 » 

Ставиш /GR в компиляторские установки - работает - 100% ...

Насколько я понял - используется для создания run-time type information

Но как только так сразу ... глюк глюк Улыбаюсь

Да вот описание

/GR (Enable Run-Time Type Information)
/GR
This option (/GR) adds code to check object types at run time. When this option is specified, the compiler defines the _CPPRTTI preprocessor macro. The option is cleared (/GR–) by default.

For more information on run-time type checking, see Run-Time Type Information in the C++ Language Reference.

To set this compiler option in the Visual Studio development environment

Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties.
Click the C/C++ folder.
Click the Language property page.
Modify the Enable Run-Time Type Info property.
To set this compiler option programmatically

See RuntimeTypeInfo Property.
Записан

А птичку нашу прошу не обижать!!!
Pu
Большой босс

ru
Offline Offline
78


« Ответ #18 : 26-08-2003 12:57 » 

Большое сенк
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines