如何在c ++中检查对象类型

时间:2012-10-21 13:20:58

标签: c++ oop inheritance

例如我们有一个Animal类,我们创建了一些其他类,如Lion类,Tiger类等。我已经制作了一个Animal类的列表,我希望横向列表并根据列表中每个成员的类的类型处理列表。

Class Animal
Class Tiger :: public Animal{}
Class Lion :: public Animal{}
list<Animal> l;
Tiger T;
Lion L;
l.push_back(T); l.push_back(L);
if the top member of the list is Tiger print"ITs a tiger"
else print"something"

简单地说,我想检查创建的实例的类型。我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

这称为RTTI,这不是很好的编码实践。

这就是说,如果你真的想知道一个班级的类型,你可以做

if (typeid(myanimal) == typeid(Tiger)) {
    // Do something tiger-like
}

我建议您使用所有Animal的公共接口,例如sayHello()方法。你会有

class Animal {
    void sayHello() = 0;
    // Other things
}

Tiger中,这将是

Tiger::sayHello() {
    cout << "Hello I'm a Tiger!" << endl;
}

然后,从您的vector<Animal*>(您需要使用指针)调用

myAnimal->sayHello();

答案 1 :(得分:2)

您可以检查类型(typeid),是的,但您不需要。

您可以在std::list<std::unique_ptr<Animal> >中按住virtual并拥有Animal方法。这样你就可以利用多态性。

class Animal
{
public: 
    virtual void print() = 0;
};
class Tiger : Animal
{
    virtual void print() { std::cout << "I'm a tiger"; }
};

Animal* pA = new Tiger;
pA->print(); // prints tiger

答案 2 :(得分:0)

使用dynamic_cast并检查结果是否有效。 但!!!!!!!你通常是一个不好的做法:在你的情况下,在基类中声明虚函数更好 virtual std :: string printMe()const = 0; 并在每个班级实施。