gpt4 book ai didi

c++ - 在基类中调用同名方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:26 25 4
gpt4 key购买 nike

基类 A 有一个子类 BB 有一个子类 CA 实现了一个虚方法doStuff()B 没有,C 有。在 C 中,我想调用 AdoStuff() 实现(我在 C 中执行此操作是 doStuff() 的实现,但这并不重要。)我应该调用:

A::doStuff();

或者:

B::doStuff();

第一个看起来更清楚,因为它指的是实际实现。另一方面,如果我稍后决定 B 需要以不同于 A 的方式doStuff(),则第二个可能更有用。哪个更标准?哪个更危险?

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

最佳答案

首先,关于最后一段,是的,您完全正确。

接下来,对于主要问题:

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

但是,您应该查看模板方法 模式。我的猜测是,如果你想让 CA 调用一些东西,后来你决定你想要 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();
}

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

  • 如果我想用最派生类中的逻辑调用 doStuff(),我会调用 doStuff()
  • 如果我想用最派生类中的逻辑调用doStuff(),但我还想要来自A的逻辑,我调用doAStuffAndStuff( )

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

关于c++ - 在基类中调用同名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com