假设我有class SuperClass { public: int a; }
and class SubClass : SuperClass { public: int b; }
我获取了一个指向子类实例的指针SubClass *subPointer
并将该指针寻址到超类指针SuperClass *superPointer = subPointer
。现在我当然可以随时施放superPointer
对象指向子类的指针,因为它存储的唯一内容是地址。但我怎么知道这个物体是否superPointer
是指向子类的实例还是只是一个超类指针?
你通常don't想要使用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 *
to base *
你通常期望看到发生的事情(你可能想要class SubClass : public SuperClass
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)