Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как определить, что указатель является подклассом?


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

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

Код

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) ) {
      // правда
   }
   
}


Автор: 586 21.10.2009, 23:37
Код
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)
   {
        // правда
   }
}

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

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

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

Автор: bsa 22.10.2009, 10:38
Dims, обычно, что-то подобные решается путем добавления виртуального метода clone(), который будет создавать точную копию объекта.

Автор: xvr 22.10.2009, 15:03
Вместо этого
Код

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

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

Автор: Dims 23.10.2009, 11:23
Судя по мануалу 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.

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

Увы, это так  smile Тогда только dynamic_cast. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)