假设我有一个接口类和部分实现类。此外,假设我绝对不希望这部分实现从接口继承:
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.
阅读一些其他职位计算器(如this之一)后,它似乎是唯一可用的解决方案是要做到这一点:
class myClass : interface, partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;}
void fnA() const {
partialImplementation::fnA();
}
};
在连接后,在OP并不介意键入三个多余的线条。但是,你能想象,其实我是想partialImplementation
实施不仅仅是一个功能更多,我可以一遍又一遍,每次打字这个相同的样板我想使一个新的类继承这个接口。
有谁知道一个办法做到这一点,而无需partialImplementation
从interface
继承?
目前尚不清楚你打算做什么。但有一两件事是肯定的:在您的解决方案fnA()
的partialImplementation
无关与fnA()
的interface
,因为这两个类是不相关的。此外,在partialImplementation
这个功能是不是虚拟的。
因此,为了得到partialImplementation
的fnA()
在从接口派生的类的虚函数,你已经暴露了明确的呼叫进行的唯一途径。
如果你想摆脱的样板代码,你必须做出partialImplementation
从interface
继承。它仍然是不能被实例化一个抽象类,因为fnB()
至今下落不明。
class partialImplementation : public interface { ... };
class myClass : public partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;}
};
为什么你不希望这个产业目前尚不清楚。如果你要在若干个不同的部分实现结合起来,在一个mixin阶梯,但要避免几个不同的接口子对象,你可以选择虚拟继承:
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:
};
带来的不便,是继承已被宣布为各级虚拟。但它允许达到的那种你希望在无样板代码做的事情。