使用从B继承的具体函数实现从A继承的虚拟函数

Implement virtual function inherited from A using concrete function inherited from B

本文关键字:函数 继承 实现 虚拟      更新时间:2023-10-16

假设我有一个接口类和一个部分实现类。此外,假设我绝对不希望这个部分实现继承自接口:

class interface {
virtual void fnA() const = 0; 
virtual void fnB() const = 0; 
};
class partialImplementation { //Do not want to inherit from interface!
void fnA() const {cout << "fnA from partial implementation" << endl;}
//fnB() not implemented
};

我的想法是,我计划创建几个新的类,它们都继承接口,但我希望在每个类中实现相同的fnA()。所以,在继承了接口之后,也许我也可以继承部分实现,并希望fnA()能够实现。例如,

class myClass : interface, partialImplementation {
//would like fnA() to be implemented by partialImplementation
void fnB() const {cout << "fnB from myClass" << endl;} 
};

当然,如果你试图实例化这个类,你会得到这样的错误:

main.cpp: In function 'int main()':
main.cpp:235:10: error: cannot declare variable 'm' to be of abstract type 'myClass'
main.cpp:201:7: note:   because the following virtual functions are pure within 'myClass':
main.cpp:193:15: note:  virtual void interface::fnA() const
Compilation failed.

在阅读了其他一些stackoverflow帖子(比如这篇)之后,似乎唯一可用的解决方案是这样做:

class myClass : interface, partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;} 
void fnA() const {
partialImplementation::fnA();
}
};

在链接的帖子中,OP并不介意多输入三行。但你可以想象,我实际上希望partialImplementation实现不止一个函数,每次我想创建一个继承这个接口的新类时,我都可以一遍又一遍地键入相同的样板文件。

有人知道一种不需要partialImplementationinterface继承的方法吗?

您不想要的选项

目前还不清楚你打算做什么。但有一点是肯定的:在你的解决方案中,partialImplementationfnA()interfacefnA()无关,因为这两个类都不相关。此外,在partialImplementation中,该功能不是虚拟的。

因此,要将partialImplementationfnA()作为从接口派生的类中的虚拟函数,您公开的显式调用是唯一的方法。

如果你想去掉样板代码,你必须让partialImplementation继承interface。它仍然是一个无法实例化的抽象类,因为fnB()仍然缺失。

class partialImplementation : public interface { ... };
class myClass : public partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;} 
};

想要组合几个部分实现吗

目前还不清楚你为什么不想要这笔遗产。如果你想在一个mixin-stle中组合几个不同的部分实现,但又想避免有几个不同的接口子对象,你可以选择虚拟继承:

class partialImplementationA : public virtual interface { 
public: 
void fnA() const {cout << "fnA from partial implementation A" << endl;}
};
class partialImplementationB : public virtual interface { 
public: 
void fnB() const {cout << "fnB from partial implementation B" << endl;}
};
class myClass : public virtual interface, 
public partialImplementationA, 
public partialImplementationB {
public:
};

在线演示

不便之处在于,继承必须在所有级别上声明为虚拟继承。但它允许在没有样板代码的情况下实现您想要做的事情。