使用从B继承的具体函数实现从A继承的虚拟函数
Implement virtual function inherited from A using concrete function inherited from B
假设我有一个接口类和一个部分实现类。此外,假设我绝对不希望这个部分实现继承自接口:
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
实现不止一个函数,每次我想创建一个继承这个接口的新类时,我都可以一遍又一遍地键入相同的样板文件。
有人知道一种不需要partialImplementation
从interface
继承的方法吗?
您不想要的选项
目前还不清楚你打算做什么。但有一点是肯定的:在你的解决方案中,partialImplementation
的fnA()
与interface
的fnA()
无关,因为这两个类都不相关。此外,在partialImplementation
中,该功能不是虚拟的。
因此,要将partialImplementation
的fnA()
作为从接口派生的类中的虚拟函数,您公开的显式调用是唯一的方法。
如果你想去掉样板代码,你必须让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:
};
在线演示
不便之处在于,继承必须在所有级别上声明为虚拟继承。但它允许在没有样板代码的情况下实现您想要做的事情。
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承