dynamic_cast与在父类 (C++) 中公开虚函数

dynamic_cast vs exposing virtual functions in parent class (C++)

本文关键字:函数 C++ cast 父类 dynamic      更新时间:2023-10-16

我有一个父类"base"和另一个从"base"继承的类"派生"。

"派生"有 1 个方法 cH1。

如果我这样做:

base* b = new derived();

我希望能够做到这一点:

b->cH1();

显然我不能,有两种解决方案:

  • 要么在基数上将 cH1 声明为纯虚拟。
  • 或执行此操作:

    dynamic_cast<derived*>(b)->cH1();
    

哪一个是更好的做法?

如果cH1方法在语义上适用于base,则使其成为base的方法。否则,将cH1留给derived,并使用dynamic_cast。我认为你的类的语义应该驱动你的选择。

例如,如果你有一个基类Vehicle和派生类CarMotorbikeAircraft,像TakeOff()这样的方法具有与Aircraft兼容但不兼容CarMotorbike的语义,因此您可能希望使TakeOff()成为Aircraft方法,而不是Vehicle方法。

dynamic_cast

干净、更灵活,但速度慢一些。

请记住,当您使用 dynamic_cast 检查返回的指针是否为 NULL 时。

首先,为了使用dynamic_castbase必须至少有一个虚函数。

其次,使用dynamic_cast通常是设计错误的标志。如果derived真的是base的子对象,那么一个derived对象应该能够站在任何期望base对象的地方,这通常意味着base具有虚函数,无论是纯虚函数还是非虚函数,并且derived覆盖了其中的一部分或全部。

但是,如果不知道cH1的作用,就不可能推荐一种方法。