Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить, что указатель является подклассом? 
:(
    Опции темы
Dims
Дата 21.10.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Как во время выполнения определить, что один указатель имеет тип, унаследованный от другого?

Что-нибудь вроде этого:

Код

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

int main() {
   Base* pb = new Base;
   Base* pd = (Base*) (new Derived);

   if( typeid(pd) > typeid(pb) ) {
      // правда
   }
   
}


PM MAIL   Вверх
586
Дата 21.10.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Код
class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

int main() {
   Base* pd = new Derived;
   Derived *d = dynamic_cast<Derived*>(pd);
   if(d != 0)
   {
        // правда
   }
}


Это сообщение отредактировал(а) 586 - 21.10.2009, 23:41
PM   Вверх
Леопольд
Дата 22.10.2009, 09:08 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Не забываем про исключения: http://cplusplus.com/reference/std/typeinfo/bad_cast/
Следует учесть, что dynamic_cast работает медленно. 
Считается что присутствие dynamic_cast в программе говорит о необходимости перепроектирования.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alek86
Дата 22.10.2009, 09:29 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Леопольд @  22.10.2009,  09:08 Найти цитируемый пост)
Не забываем про исключения:

при работе с указателями они не нужны


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 22.10.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Dims, обычно, что-то подобные решается путем добавления виртуального метода clone(), который будет создавать точную копию объекта.
PM   Вверх
xvr
Дата 22.10.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Вместо этого
Код

   if( typeid(pd) > typeid(pb) ) {
      // правда
   }
используй это
Код

  if ( typeid(pb).before(typeid(pd)) ) ...

PM MAIL   Вверх
Dims
Дата 23.10.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Судя по мануалу before это про другое:

Цитата

There is no link between the collating order of types and inheritance relationships. Use the type_info::before member function to determine the collating sequence of types. There is no guarantee that type_info::before will yield the same result in different programs or even different runs of the same program. In this manner, type_info::before is similar to the address-of (&) operator.


Это сообщение отредактировал(а) Dims - 23.10.2009, 11:24
PM MAIL   Вверх
xvr
Дата 23.10.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Dims @ 23.10.2009,  11:23)
Судя по мануалу before это про другое:

Увы, это так  smile Тогда только dynamic_cast. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.