假设我有一个接口类和一个部分实现类。另外,假设我绝对不希望该部分实现从接口继承:
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帖子(例如this)之后,似乎唯一可用的解决方案是执行以下操作:
class myClass : interface, partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;}
void fnA() const {
partialImplementation::fnA();
}
};
在链接的帖子中,OP不在乎键入三行。但是您可以想象,我实际上希望partialImplementation
实现的不仅仅是一个函数,而且每次我想创建一个继承该接口的新类时,我可能会一遍又一遍地键入相同的样板。
有人知道一种无需partialImplementation
从interface
继承的方法吗?
答案 0 :(得分:0)
目前尚不清楚您打算做什么。但是可以肯定的是:在您的解决方案中,fnA()
的{{1}}与partialImplementation
的{{1}}没有任何关系,因为这两个类都不相关。此外,在fnA()
中,此功能不是虚拟的。
因此,要使interface
的{{1}}作为从接口派生的类中的虚函数,必须进行公开的显式调用。
如果要摆脱样板代码,则必须使partialImplementation
从partialImplementation
继承。由于fnA()
仍然缺少,因此它将仍然是无法实例化的抽象类。
partialImplementation
不清楚您为什么不想要这种继承。如果要在mixin阶梯中组合几个不同的部分实现,但又想避免有几个不同的接口子对象,则可以选择虚拟继承:
interface
不便之处在于,必须在所有级别将继承声明为虚拟。但是,它允许您在没有样板代码的情况下完成您想做的事情。