在基类中调用具有相同名称的方法

Luk*_*uke 5 c++ methods virtual subclass base-class

基类A有一个子类B,并B有一个子类C.A实现虚拟方法doStuff(),B不实现和C实现.从C,我想调用它A的实现doStuff()(我从内部C执行中执行此操作,doStuff()但这不应该真正重要.)我应该调用:

A::doStuff();
Run Code Online (Sandbox Code Playgroud)

要么:

B::doStuff();
Run Code Online (Sandbox Code Playgroud)

第一个似乎更清楚,因为它指的是实际的实现.另一方面,如果我后来决定B需要的doStuff()不同,那么第二个可能会更有用A.哪个更标准?哪个更危险?

我有点惊讶,B::doStuff()没有触发任何警告,但我认为根据定义B,即使它来自基类,也有一个实现.基类和实现链是否可以任意长且复杂?例如,如果我A通过Z,每个都是前一个的子类,我可以在链中的任何地方实现,并且调用任何类的方法只是"上链"直到找到实现?

Luc*_*ore 2

首先,关于最后一段,是的,你是绝对正确的。

接下来,针对主要问题:

这是一个逻辑问题,应该具体情况具体对待。您是唯一可以决定是否要从B或 从调用逻辑的人A,即使B::doStuff()尚未实现。没有正确答案。

但是,您应该研究模板方法模式。我的猜测是,如果您想C调用 的某些内容A,后来又决定要D( 的兄弟C)做同样的事情,那么您就是在重复代码。所以我会采取不同的方法:

class A
{
private:
   void doAStuff(); //doesn't have to be here
public:
   virtual void doStuff()
   {
      doAStuff();
   }
   void doAStuffAndStuff();
   {
      doAStuff();
      doStuff();
   }
}

class B : A
{
public:
   virtual void doStuff(); //or not
}

class C : B
{
public:
   virtual void doStuff();
}
Run Code Online (Sandbox Code Playgroud)

IMO 这更直观。假设我有一个A* a,我不知道 的动态类型a

  • 如果我想使用doStuff()最派生类中的逻辑进行调用,我会调用doStuff().
  • 如果我想使用doStuff()最派生类中的逻辑进行调用,但我也想要来自 的逻辑A,那么我会调用doAStuffAndStuff()

我将这种方法作为一种替代方法。我并不是说它一定适用于您的情况,但可能会。