继承、覆盖和虚函数,避免重复代码

Posted

技术标签:

【中文标题】继承、覆盖和虚函数,避免重复代码【英文标题】:Inheritance, overriding, and virtual functions to avoid repeated code 【发布时间】:2020-06-07 11:56:32 【问题描述】:

我有A、B、C三个类。B和C都是从A派生的。B和C都需要实现一个方法F。 B.F() 中的代码是 C.F() 的子集。

    A.F()声明为虚函数并定义B.F()C.F()是不是一个好方法?两种方法中会有相同的代码,我想避免。其他是什么 可能性? 用通用代码定义A.F() 并在C.F() 中覆盖它。在覆盖的同时,如何在 C.F() 中使用 A.F() 的输出,从而避免重复代码?

【问题讨论】:

【参考方案1】:

    我想这不是最好的做法。如果您可以避免代码重写 - 当然可以。

    最好在A 中定义F(),正如您所说,使用BC 的公共代码,然后在C.F() 中覆盖它,使用A::F() 调用覆盖函数。我的意思是,你可以先执行父方法A.F(),然后再使用新的额外逻辑。如果您从A 继承B,那么您根本不应该为B 中的这种方法而烦恼。

请注意,从这个角度来看,顺序很重要。如果您希望首先执行父代码,请在附加逻辑之前调用A::F()。不过,选择什么顺序由您决定。

编辑

如果您不知道如何在子方法中调用父方法代码,我将添加一个link 并为您提供一个很好的示例。看一看,玩得开心。

【讨论】:

以上是关于继承、覆盖和虚函数,避免重复代码的主要内容,如果未能解决你的问题,请参考以下文章

虚函数指针和虚函数表

一文详解C++类的内存布局和虚函数底层实现机制

解析虚函数表和虚继承

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

单继承与多继承中的虚函数表和虚函数指针

delphi中覆盖override父类的静态方法和虚函数有啥不同?