Как узнать принадлежит ли объект классу?
Как узнать принадлежит ли объект к классу pawn? Не знаю на сколько глупый вопрос , просто у меня в методе все наследники и их методы запускались через объект fi и мне нужно в одном из условий метода game исключить pawn, оставив других наследников.
class figure{};
class Pawn : public figure{};
class Game{
void metod(figure fi){
if(){ } // Как проверить fi на принадлежность к Pawn в if
};
};
Ответы (1 шт):
Давайте рассмотрим ваш метод. И все же рассмотрим передачу по ссылке в дополнение к передаче по значению.
class figure
{
};
class Pawn : public figure
{
};
void value(figure fi)
{
cout << "val typeid check: " << (typeid(fi) == typeid(Pawn)) << endl;
}
void refer(figure& fi)
{
cout << "ref typeid check: " << (typeid(fi) == typeid(Pawn)) << endl;
}
int main()
{
Pawn p;
value(p);
refer(p);
}
Ой. Метод не работает в обоих случаях — говорит, что это figure. Почему? Да из-за отсутствия виртуальных функций, ergo, vtable, на которую опирается этот механизм RTTI.
Добавил виртуальность:
#include <iostream>
using namespace std;
class figure
{
public:
virtual ~figure(){}
};
class Pawn : public figure
{
public:
virtual ~Pawn(){}
};
void value(figure fi)
{
cout << "val typeid check: " << (typeid(fi) == typeid(Pawn)) << endl;
}
void refer(figure& fi)
{
cout << "ref typeid check: " << (typeid(fi) == typeid(Pawn)) << endl;
}
int main()
{
Pawn p;
value(p);
refer(p);
}
Теперь метод работает — но только при передаче по ссылке (а равно и через указатель, но я его тут не привожу), о чем я и писал в своем комментарии.
Но при наличии виртуальности можно применить и dynamic_cast, который, кроме прочего, дает возможность получить переданный объект типа Pawn — если он, конечно, передан. Я тут специально проверяю через адрес, просто чтоб не возиться с обработкой исключения bad_cast.
#include <iostream>
using namespace std;
class figure
{
public:
virtual ~figure(){}
};
class Pawn : public figure
{
public:
virtual ~Pawn(){}
};
void value(figure fi)
{
cout << "val typeid check: " << (dynamic_cast<Pawn*>(&fi) != nullptr) << endl;
if (dynamic_cast<Pawn*>(&fi) != nullptr)
{
Pawn& p = dynamic_cast<Pawn&>(fi);
}
}
void refer(figure& fi)
{
cout << "val typeid check: " << (dynamic_cast<Pawn*>(&fi) != nullptr) << endl;
if (dynamic_cast<Pawn*>(&fi) != nullptr)
{
Pawn& p = dynamic_cast<Pawn&>(fi);
}
}
int main()
{
Pawn p;
value(p);
refer(p);
}
Ну, а дальше — "думайте сами, решайте сами" (с)...