如何使用派生类中的函数而不将其添加到基类中

时间:2019-01-01 23:23:06

标签: c++ oop inheritance interface solid-principles

这很可能是一个愚蠢的问题,但我似乎无法弄清楚这是否完全可能,以及是否应该实际完成。

说一些代码在很大程度上取决于使用某个虚拟基类作为接口,然后派生几个实现该虚拟方法的基类的子类。当程序的其余部分除了基类“接口”之外什么都看不到时,是否可以使用下面基类(接口)中不存在的功能,而无需完全忽略扎实的原则?像下面的示例一样,是否可以在仅知道A的函数中使用B类中的bar()?我应该只将bar()添加到“接口”吗?

// Base class - "interface"
Class A
{
    public:
        virtual int foo();
}

// Derived class - implementing the "interface" + more
Class B: public A
{
    public:
        int foo();
        int bar();
}

int main()
{

    function(A); // Some magic function that would utlize the bar() method

    return 0;
}

1 个答案:

答案 0 :(得分:1)

简短的答案是肯定的,请使用dynamic_cast运算符(但请参见下文)。魔术函数看起来像这样:

void function(A& a)
{
  B* b = dynamic_cast<B*>(&a);
  if (b)
  {
    // Object is a B...
    b->bar();
  }
  else
  {
    // fallback logic using only methods on A
  }
}

但是请注意,许多程序员认为这是一种代码味道。特别是,如果没有办法实现“后备”分支,则表明该函数应确实接受B,并且设计中的某些内容可能不正确。 (但是,在这种笼统的讨论中很难说。)另外请注意,dynamic_cast可能很昂贵,尤其是在复杂的类层次结构中。

如果完全合理,最好以某种方式将B特定的逻辑移到B类中。您也可以考虑使bar方法成为A类的成员(A将提供一些明智的默认实现)。另一种方法可能是创建一个新接口来容纳bar方法,并使您的函数接受该类型的对象。 (B类将实现A和新接口。)