dynamic_cast vs公开父类中的虚函数(C ++)

时间:2012-09-14 15:26:50

标签: c++ dynamic-cast

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

“derived”有1个方法cH1。

如果我这样做:

base* b = new derived();

我希望能够做到这一点:

b->cH1();

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

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

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

哪一个是更好的做法?

3 个答案:

答案 0 :(得分:7)

如果cH1方法在语义上适用于base,请将其设为base方法。 否则,请将cH1留给derived,然后使用dynamic_cast。 我认为你的课程的语义应该是你的选择。

例如,如果您有基类Vehicle和派生类CarMotorbikeAircraft,则TakeOff()之类的方法具有语义与Aircraft兼容,但与CarMotorbike不兼容,因此您可能需要TakeOff() Aircraft方法,而不是Vehicle方法。

答案 1 :(得分:3)

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

其次,使用dynamic_cast 通常是设计错误的标志。如果derived确实是base的孩子,那么derived对象应该能够站在预期base对象的任何位置,这通常意味着{{1}有虚拟函数,无论是纯虚函数还是非虚函数,base都会覆盖部分或全部函数。

不知道derived做了什么,但是不可能推荐一种方法。

答案 2 :(得分:2)

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

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