Finding the type of an object in C++

2019-01-01 01:34发布

I have a class A and another class that inherits from it, B. I am overriding a function that accepts an object of type A as a parameter, so I have to accept an A. However, I later call functions that only B has, so I want to return false and not proceed if the object passed is not of type B.

What is the best way to find out which type the object passed to my function is?

标签: c++ types
11条回答
美炸的是我
2楼-- · 2019-01-01 02:29

Just to be complete, I'll build build off of Robocide and point out that typeid can be used alone without using name():

#include <typeinfo>
#include <iostream>

using namespace std;

class A {
public:
    virtual ~A() = default; // We're not polymorphic unless we
                            // have a virtual function.
};
class B : public A { } ;
class C : public A { } ;

int
main(int argc, char* argv[])
{
    B b;
    A& a = b;

    cout << "a is B: " << boolalpha << (typeid(a) == typeid(B)) << endl;
    cout << "a is C: " << boolalpha << (typeid(a) == typeid(C)) << endl;
    cout << "b is B: " << boolalpha << (typeid(b) == typeid(B)) << endl;
    cout << "b is A: " << boolalpha << (typeid(b) == typeid(A)) << endl;
    cout << "b is C: " << boolalpha << (typeid(b) == typeid(C)) << endl;
}

Output:

a is B: true
a is C: false
b is B: true
b is A: false
b is C: false
查看更多
长期被迫恋爱
3楼-- · 2019-01-01 02:31

Because your class is not polymorphic. Try:

struct BaseClas { int base; virtual ~BaseClas(){} };
class Derived1 : public BaseClas { int derived1; };

Now BaseClas is polymorphic. I changed class to struct because the members of a struct are public by default.

查看更多
余生无你
4楼-- · 2019-01-01 02:32

Probably embed into your objects an ID "tag" and use it to distinguish between objects of class A and objects of class B.

This however shows a flaw in the design. Ideally those methods in B which A doesn't have, should be part of A but left empty, and B overwrites them. This does away with the class-specific code and is more in the spirit of OOP.

查看更多
看淡一切
5楼-- · 2019-01-01 02:32

Use overloaded functions. Does not require dynamic_cast or even RTTI support:

class A {};
class B : public A {};

class Foo {
public:
    void Bar(A& a) {
        // do something
    }
    void Bar(B& b) {
        Bar(static_cast<A&>(b));
        // do B specific stuff
    }
};
查看更多
永恒的永恒
6楼-- · 2019-01-01 02:37

Are you looking for dynamic_cast<B*>(pointer)?

查看更多
登录 后发表回答