Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从重写函数调用重写函数_C++_Inheritance_Oop_Virtual_Overriding - Fatal编程技术网

C++ 从重写函数调用重写函数

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框架使用它来回退基类的默认实现,其中包含代码

假设我在类B中有一个虚拟函数foo(),并且我需要在B的一个派生类类D中有一个稍微不同的行为。在特殊情况处理之后,创建一个重写函数D::foo()并从那里调用B::foo()可以吗?像这样:

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当前位置我刚刚验证了我的答案,似乎是正确的。