C++ 从重写函数调用重写函数
假设我在类B中有一个虚拟函数foo(),并且我需要在B的一个派生类类D中有一个稍微不同的行为。在特殊情况处理之后,创建一个重写函数D::foo()并从那里调用B::foo()可以吗?像这样:C++ 从重写函数调用重写函数,c++,inheritance,oop,virtual,overriding,C++,Inheritance,Oop,Virtual,Overriding,假设我在类B中有一个虚拟函数foo(),并且我需要在B的一个派生类类D中有一个稍微不同的行为。在特殊情况处理之后,创建一个重写函数D::foo()并从那里调用B::foo()可以吗?像这样: void D::foo() { if (/*something*/) // do something else B::foo(); } 我不是问这是否有效,我知道会的。我想知道,就良好的OOD而言,它是否正确。是的,是的。我看到GUI框架使用它来回退基类的默认实现,其中包含代码
void D::foo()
{
if (/*something*/)
// do something
else
B::foo();
}
我不是问这是否有效,我知道会的。我想知道,就良好的OOD而言,它是否正确。是的,是的。我看到GUI框架使用它来回退基类的默认实现,其中包含代码来表示错误/引发异常/返回泛型值。是的,只要你不违反利斯科夫替换原则,这是完全可以的。这非常好。事实上,执行某些操作的规范方法是调用基类方法,然后执行任何操作(或者反过来)。我在想这里的
操作符=
。构造函数通常也是这样工作的,即使这在初始化列表中有点隐蔽。是的,编译器每次生成构造函数和析构函数时都会为您这样做:例如调用母亲的构造函数。我经常在我自己的代码中使用这个“技巧”。没关系。您给出的语法也可用于临时关闭多态性,即,当您调用obj->B::foo()方法时,将从类B中选择,无论foo()是否为虚拟的,以及obj是否为B的实例(但必须是扩展B的类的实例)。调用base的实现也可以,但是有条件地这样做会让你远离构造器语义,这与其他答案中的建议相反
您可能会在两个方面遇到问题:
- 通过假设
为整个层次结构提供了公共行为(即,忘记方法并不总是被调用)B::foo()
- 讨厌的问题取决于
//做一些事情
实际做的事情李>
为了完整性,让我们提到对称设计方法:(基本实现调用特定子部分)常见、标准、正常、典型、广泛使用。事实上,能够做到这一点是绝对必要的。你不能保证函数不是从B的子类调用的,在这种情况下,你根本就不会改变任何事情。@xtofl:你说如果我有B扩展a,C扩展B,即。A@xtolf当前位置我刚刚验证了我的答案,似乎是正确的。