如何检查一个 C++类扩展另一个类(就像另一个类是接口一样)?

发布于 2024-10-12 03:20:01 字数 189 浏览 5 评论 0原文

因此,通常

class A { ... };
class B { ... };
class C: public A, public B {};  // C inherits from A and B.

当我们创建 C 的实例并希望将其传递给某个函数时,我们会检查传递给函数的类是否扩展了 A 吗?

So generally having

class A { ... };
class B { ... };
class C: public A, public B {};  // C inherits from A and B.

when we create an instance of C and want to pass it into some function ho do we check if class we pass to a function is extending A?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

话少心凉 2024-10-19 03:20:01

C 被定义为从 A 继承,因此无需检查:

C 的实例必须也是 A(和 B)。

但是,如果您有一个将 A 作为参数的函数,则可以使用 dynamic_cast<> 来检查实例是否实际上是 C

void function(const A& a)
{
  const C* c = dynamic_cast<const C*>(&a);

  if (c)
  {
    // a is an instance of C and you can use c to call methods of C
  } else
  {
    // a is not an instance of C.
  }
}

但是,要使其工作,基类类型必须是多态的(它必须至少有一个虚拟方法)。

C is defined as inheriting from A so there is no need to check:

It is mandatory that an instance of C is also a A (and a B).

However, if you have a function taking a A as a parameter, you can use dynamic_cast<> to check if the instance is actually a C:

void function(const A& a)
{
  const C* c = dynamic_cast<const C*>(&a);

  if (c)
  {
    // a is an instance of C and you can use c to call methods of C
  } else
  {
    // a is not an instance of C.
  }
}

For this to work, however, the base class type must be polymorphic (it must have at least a virtual method).

私野 2024-10-19 03:20:01

您唯一需要执行此操作的时间是在编译期间,因为隐式转换在其他任何地方都适用。但是如果你想查看某个类型 T 是否是某个类型 S 的基类,那么你可以使用 SFINAE (或者只使用 is_base_of<>):

template < typename T, typename S >
struct is_base_of // checks if T is a base of S
{
  typedef char (yes&) [1];
  typedef char (no&)  [2];

  void yes check(T*);
  void no  check(...);

  enum { value = sizeof(check(static_cast<S*>(0))) == sizeof(yes); }
};

The only time you'd need to do this is during compile time since implicit conversion works everywhere else. But if you want to see if some type T is a base of some type S then you can use SFINAE (or just use is_base_of<>):

template < typename T, typename S >
struct is_base_of // checks if T is a base of S
{
  typedef char (yes&) [1];
  typedef char (no&)  [2];

  void yes check(T*);
  void no  check(...);

  enum { value = sizeof(check(static_cast<S*>(0))) == sizeof(yes); }
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文