class Object
{
public:
virtual const type_info& GetType ()
{ return typeid(this); }
Object () {};
};
C++: виртульный GetType через typeid
Нечто вроде:
Код:
Проблема в том, что при виртуальном вызове указатель this будет интерпретироваться как указатель на экземпляр базового класса, в результате чего желаемого эффекта можно добиться только перегружая реализацию в производных классах аналогичным кодом. Можно конечно хранить указатель на type_info, но это слишком большой оверхед. Можно и макрос сделать - но тоже не то: хочется честного решения.
АПД. Кстати, а зачем? type_info уныл совсем, даже возможностей Delphi не предоставляет, не говоря уже об отражении в стиле Java или .NET.
Ну, во-первых, он является частью стандарта, во-вторых, я не знаю, что есть лучше - читал только, что даже в Loki ничего прогрессивнее враппера над ним не придумали. Мне это, вообщем-то, для лабы нужно - просто, чтобы делать ветвление-по-типу из указателя на базовый класс, но очень хотел бы узнать о альтернативах (для C++, конечно).
...
Понял. Потому тупое решение убрал.
Код:
struct A
{
virtual const type_info& GetType()
{
return typeid(*this);
}
};
struct B: public A
{
};
int main()
{
A *b = new B();
cout << b->GetType().name() << endl;
delete b;
b = new A();
cout << b->GetType().name() << endl;
delete b;
return 0;
}
{
virtual const type_info& GetType()
{
return typeid(*this);
}
};
struct B: public A
{
};
int main()
{
A *b = new B();
cout << b->GetType().name() << endl;
delete b;
b = new A();
cout << b->GetType().name() << endl;
delete b;
return 0;
}
Цитата: Ander Skirnir
Мне это, вообщем-то, для лабы нужно - просто, чтобы делать ветвление-по-типу из указателя на базовый класс, но очень хотел бы узнать о альтернативах
Всякие страшные паттерны типа стратегии и прочих изысков не подходят?
Теперь было бы неплохо разобраться, как это возможно :rolleyes:
Цитата: Kogrom
Попытка №2
Код:
struct A
{
virtual const type_info& GetType()
{
return typeid(*this);
}
};
struct B: public A
{
};
int main()
{
A *b = new B();
cout << b->GetType().name() << endl;
delete b;
b = new A();
cout << b->GetType().name() << endl;
delete b;
return 0;
}
{
virtual const type_info& GetType()
{
return typeid(*this);
}
};
struct B: public A
{
};
int main()
{
A *b = new B();
cout << b->GetType().name() << endl;
delete b;
b = new A();
cout << b->GetType().name() << endl;
delete b;
return 0;
}
Не тронь Будду:D