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,每个都是前一个的子类,我可以在链中的任何地方实现,并且调用任何类的方法只是"上链"直到找到实现?
首先,关于最后一段,是的,你是绝对正确的。
接下来,针对主要问题:
这是一个逻辑问题,应该具体情况具体对待。您是唯一可以决定是否要从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()。我将这种方法作为一种替代方法。我并不是说它一定适用于您的情况,但可能会。