【问题标题】:If I own a C++ base class but don't own or even know about derived classes, can I tell if a given object is an instance of a derived class?如果我拥有 C++ 基类但不拥有甚至不知道派生类,我能否判断给定对象是否是派生类的实例?
【发布时间】:2021-09-14 20:31:53
【问题描述】:

我不能使用 dynamic_cast,因为我不知道派生类的名称。对于 std::is_base_of 也是如此。

【问题讨论】:

  • 基类是纯虚的吗?那么答案是肯定的,物有所值。
  • 通常,如果您关心一个对象实际上是派生类型还是基类型,那么您可能在使用继承时犯了一个错误。
  • 问题不清楚。您无需知道类型的名称即可查询该类型的属性。一旦你有一个对象:using type_of_the_object = decltype(object);
  • typeid 应该为您提供多态类型,您可以将其与已知的基类类型进行比较。

标签: c++ hierarchy base derived


【解决方案1】:

您的问题基本上是如何检查您拥有的对象的动态类型(通过指针或引用Base)实际上是否为Base。这是typeid的工作:

struct Base { /* ... */ };

bool is_actually_base(Base& b) { return typeid(b) == typeid(Base); }

如果此测试返回 false,则该对象必须是派生类类型(或者您在某处搞砸了,您的程序有未定义的行为)。

请注意,这仅在Base 包含至少一个虚函数(可能是继承的)时才有效。如果不是这样,那就没有办法检查了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2023-03-19
    相关资源
    最近更新 更多