在 C++ 中虚拟基类的两个实现之间共享方法

Posted

技术标签:

【中文标题】在 C++ 中虚拟基类的两个实现之间共享方法【英文标题】:Sharing methods between two implementations of a virtual base class in C++ 【发布时间】:2009-11-24 05:38:30 【问题描述】:

我有一个虚拟基类和两个实现各种方法的类。对于其中一种方法,这两个类具有相同的功能。有没有我可以在两个类之间共享实现以消除冗余代码?除了虚拟基类之外,我尝试将第一个类作为第二个类的父类,但出现了一堆错误。

编辑 - 感谢大家的回复。我应该提到的一件事是我无法修改虚拟基类,因此仅将代码添加到基类是行不通的。

【问题讨论】:

虚拟基类是什么意思,即抽象类或虚拟继承自其他类? 一切都用 virtual methodname() = 0; 声明 @blcArmadillo:它是一个abstract 基类,而不是虚拟基类。虚拟基类在 C++ 中的含义完全不同 【参考方案1】:

假设A是基类,BC是继承自基类的类。在BC 之间共享逻辑的方法称为SomeMethod。无论您的用例如何,以下其中一项都应该可以解决问题:

获取B::SomeMethodC::SomeMethod 的逻辑并将其复制并粘贴到A::SomeMethod 创建一个类D,它提供SomeMethod 的共享版本,并让BC 派生自D,这将派生自A 创建一个类SomeMethodImpl,它只提供你想要的实现,然后B::SomeMethodC::SomeMethod的实现只会将方法调用委托给SomeMethodImpl::SomeMethod的私有实例

【讨论】:

【参考方案2】:

如果您想将基类保持为纯虚拟,请创建另一个继承自该类并实现该功能的类,然后让您的其他两个类继承自该类:

class Base  public: virtual void TheFunction(); /* blah blah other virtual functions */ ;
class OneFunctionImplemented : public Base  public: virtual void TheFunction()  DoSomething();  ;
class ChildClass1 : public OneFunctionImplemented  ;
class ChildClass2 : public OneFunctionImplemented  ;

【讨论】:

【参考方案3】:

将共享功能放在基类中。其他两个类都可以从那里访问它。

【讨论】:

【参考方案4】:

我相信虚拟基类是指具有纯虚拟函数(抽象类)的基类,而不是虚拟派生自基类。如果是这种情况,您可以将通用实现放在这个基类中,以便它可用于所有派生类。

【讨论】:

以上是关于在 C++ 中虚拟基类的两个实现之间共享方法的主要内容,如果未能解决你的问题,请参考以下文章

抽象基类的模糊继承:

如何实现虚拟机与主机之间的文件共享,复制

C++“处理多个基类的虚拟函数”

在 C++ 中父进程和子进程之间共享队列

在虚拟机VM VirtualBox Ubuntu 系统和主机window10之间实现共享文件夹

使用抽象基类的C ++“调用纯虚拟方法”[重复]