假设我有 class SuperClass { public: int a; }
和 class SubClass : SuperClass { public: int b; }
并且我获取了一个指向子类 SubClass *subPointer
实例的指针,并将该指针指向一个父类(super class)指针 SuperClass *superPointer = subPointer
。当然,现在我总是可以将 superPointer
对象转换为 SubClass 的指针,因为它唯一存储的是地址。但是我怎么知道对象 superPointer
是指向 SubClass 的实例还是只是一个 SuperClass 指针?
最佳答案
您通常不想为此使用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.
但有几点注意事项。首先,你需要在基类中至少有一个虚函数才能工作(但如果它没有虚函数,你为什么要从它继承?)
其次,想要这样往往表明代码存在设计问题。在大多数情况下,您希望在基类中定义一个虚函数,您(如有必要)在派生类中覆盖它以执行任何需要的操作,这样您就可以在整个过程中只使用指向基类的指针。
最后,就目前而言,大多数转换都会失败——您使用了默认(私有(private))继承,这会阻止从 derived *
到 base 的隐式转换*
您通常希望看到的情况(您可能希望 class SubClass : public SuperClass
)。
关于c++ - C++中如何判断指针指向的对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606586/