在基类中调用同名方法
Calling identically named methods in base classes
基类A
有一个子类B
,B
有一个子类C
。 A
实现了虚拟方法doStuff()
,B
没有,C
做到了。从C
开始,我想调用A
的doStuff()
实现(我从C
的doStuff()
实现中这样做,但这并不重要。我应该打电话吗:
A::doStuff();
或:
B::doStuff();
第一个似乎更清楚,因为它指的是实际的实现。另一方面,如果我后来决定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();
}
IMO 这更直观。假设我有A* a
,我不知道a
的动态类型:
- 如果我想用派生最多的类中的逻辑调用
doStuff()
,我调用doStuff()
。 - 如果我想用派生最多的类中的逻辑调用
doStuff()
,但我也想要来自A
的逻辑,我调用doAStuffAndStuff()
。
我说这种方法是一种替代方案。我并不是说它一定适用于你的情况,但它可能。
调用B::doStuff
.更好的是,如果可以的话,不要使用需要显式调用基类方法的设计。如果必须,请通过某些宏或别名构造模拟base.doStuff
,以防止出现此类错误。您可以在类BaseType
定义别名(并确保其在编译时存在),并使用BaseType::doStuff
语法。
我对 B::d oStuff() 没有触发任何警告有点惊讶,但我想根据定义,B 有一个实现,即使它来自基类
没有什么可警告的。在您的情况下,这是一个法律场景。
基类和实现的链可以任意长吗 而且复杂
是的,它可以,但它不应该。 需要长继承链的设计,并且包含某种隐藏规则,应该调用什么基类的方法通常会被破坏。
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用