4

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

4

2 回答 2

12

你通常不想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 *通常期望看到的发生(您可能想要class SubClass : public SuperClass)。

于 2013-07-12T03:02:33.980 回答
4

使用 RTTI 机制。喜欢:

if(typeid(*superPointer) == typeid(SuperClass)) superPointer->dosomething();
if(typeid(*superPointer) == typeid(SubClass)) superPointer->dosomethingelse();
于 2013-07-12T02:36:03.383 回答