3

我有一个父类“base”和另一个继承自“base”的类“派生”。

“派生”有 1 种方法 cH1。

如果我这样做:

base* b = new derived();

我希望能够做到这一点:

b->cH1();

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

  • 要么在基础中将 cH1 声明为纯虚拟。
  • 或这样做:

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

哪一个是更好的做法?

4

3 回答 3

7

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

例如,如果您有一个基类Vehicle和派生类Car,MotorbikeAircraft,则类似的方法具有与orTakeOff()兼容Aircraft但不兼容的语义,因此您可能希望创建一个方法,而不是方法。CarMotorbikeTakeOff()AircraftVehicle

于 2012-09-14T15:32:58.710 回答
2

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

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

但是,如果不知道是什么cH1,就不可能推荐一种方法。

于 2012-09-14T15:33:38.233 回答
2

dynamic_cast更干净,更灵活,但速度有点慢。

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

于 2012-09-14T15:30:02.907 回答