假设我有一个指向 SubClass 实例的指针,class SuperClass { public: int a; }
并将该指针指向 SuperClass 指针。当然,现在我总是可以将对象转换为 SubClass 的指针,因为它存储的唯一内容是地址。但是我怎么知道这个对象是指向一个 SubClass 的实例还是只是一个 SuperClass 指针呢?class SubClass : SuperClass { public: int b; }
SubClass *subPointer
SuperClass *superPointer = subPointer
superPointer
superPointer
问问题
3465 次
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 回答