【问题标题】:How to find out what type of object a pointer points to in C++?如何找出 C++ 中指针指向的对象类型?
【发布时间】:2013-07-12 02:28:01
【问题描述】:

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

【问题讨论】:

  • 一般情况下这个是做不到的,不过大部分情况下RTTI会告诉你如果你用它编译的话。
  • 除了@Antimony 的建议之外,还有一些方法可以将这些知识构建到对象本身中,但它们通常要求所有内容都继承自某个上帝类(还有另一个TObject,有人吗?)。大多数人会试图劝阻你不要这样做。
  • 正如建议的副本所示,最简单的做法是在SuperClass 中添加一个虚拟析构函数,然后测试dynamic_cast<SubClass *>(superPointer) 的结果。
  • 在此处查看实际操作:ideone.com/hUiIfE

标签: c++ pointers polymorphism instance


【解决方案1】:

您通常想为此使用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)。

【讨论】:

  • 轻松拥有至少一个虚函数——只需创建一个虚析构函数即可。无论如何你都需要它。
  • @paddy,可惜没有简单的方法可以做到virtual ~Class() = 0 = default;
  • +1 指出需要dynamic_cast 通常表明存在设计缺陷。
【解决方案2】:

使用 RTTI 机制。喜欢:

if(typeid(*superPointer) == typeid(SuperClass)) superPointer->dosomething();
if(typeid(*superPointer) == typeid(SubClass)) superPointer->dosomethingelse();

【讨论】:

  • 你测试过这个吗?我遇到过每次都会返回超级指针信息的问题。
猜你喜欢
  • 2023-02-09
  • 2011-05-04
  • 1970-01-01
  • 2016-12-27
  • 2014-03-18
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多