如何找出指针在C ++中指向的对象类型?

时间:2013-07-12 02:28:01

标签: c++ pointers polymorphism instance

假设我有class SuperClass { public: int a; }class SubClass : SuperClass { public: int b; },我接受了一个指向SubClass SubClass *subPointer实例的指针,并将该指针指向SuperClass指针SuperClass *superPointer = subPointer。当然,我总是可以将superPointer对象强制转换为SubClass的指针,因为它存储的唯一内容是地址。但是我怎么知道对象superPointer是指向SubClass的实例还是只是一个SuperClass指针?

2 个答案:

答案 0 :(得分:10)

您通常想要使用typeid

您通常希望使用dynamic_cast代替:

if (SubClass *p = dynamic_cast<SubClass *>(SuperClassPtr))
    // If we get here (the `if` succeeds) it was pointing to an object of 
    // the derived class and `p` is now pointing at that derived object.

虽然有几个笔记。首先,你需要在基类中至少有一个虚函数才能工作(但是如果它没有虚函数,你为什么要从它继承呢?)

其次,想要这一点往往往往表明代码的设计问题。在大多数情况下,您希望在基类中定义一个虚函数,您可以(如果需要)在派生类中重写以执行任何操作,因此您可以在整个过程中使用指向基类的指针。

最后,就目前看来,大多数转换都会失败 - 您使用了默认(私有)继承,这可以防止从derived *base *的隐式转换d通常希望看到发生(你可能想要class SubClass : public SuperClass)。

答案 1 :(得分:3)

使用RTTI机制。像:

if(typeid(*superPointer) == typeid(SuperClass)) superPointer->dosomething();
if(typeid(*superPointer) == typeid(SubClass)) superPointer->dosomethingelse();