Как узнать принадлежит ли объект классу?

Как узнать принадлежит ли объект к классу pawn? Не знаю на сколько глупый вопрос , просто у меня в методе все наследники и их методы запускались через объект fi и мне нужно в одном из условий метода game исключить pawn, оставив других наследников.

class figure{};

class Pawn : public figure{};

class Game{

void metod(figure fi){
if(){ } // Как проверить fi на принадлежность к Pawn в if 
}; 

};



Ответы (1 шт):

Автор решения: Harry

Давайте рассмотрим ваш метод. И все же рассмотрим передачу по ссылке в дополнение к передаче по значению.

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);
}

Ну, а дальше — "думайте сами, решайте сами" (с)...

→ Ссылка