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