我有一个主机类,它需要两个策略,sayhello
和talk
。策略talk
是一个类模板,它本身需要例如sayhello
。 问题是sayhello::saySomething
含糊不清host2
(我试图用virtual
来解决这个钻石问题)。基于策略的设计中的模糊继承
我该如何解决这个歧义?或者总体来说对这些问题有更好的设计?
例子:
#include <iostream>
class sayhello {
protected:
void saySomething(void) {
std::cout<<"Hello!"<<std::endl;
}
};
template<typename T>
class talk : private T {
protected:
void doSomething(void) {
T::saySomething();
}
};
template<typename T>
class host1 : virtual T {
public:
void hostAction(void) {
T::doSomething();
}
};
template<typename T, typename L>
class host2 : private T, private L {
public:
void hostAction(void) {
T::doSomething();
L::saySomething();
}
};
int main() {
host1<talk<sayhello> > HOST1;
HOST1.hostAction(); // ok that works
host2<talk<sayhello>,sayhello> HOST2;
HOST2.hostAction(); // error, ambiguity!
return 0;
}
谢谢,TemplateRex,恰好解决了这个问题。你能否解释一下为什么你有这样的感觉,遗传被滥用了? –
@the_ducky因为一个好的基于策略的设计具有*正交*策略,不可能通过不同的策略繁殖继承相同的类。一种避免这种情况的方法就像@DanielFrey所说的那样,使用虚拟类。但在你的情况下,你可能会想'sayHello :: saySomething'和'talk :: doSomething'是否可以成为'static'成员函数,所以你不必从'T'继承[[example]( http://coliru.stacked-crooked.com/a/b3921d80aba9b14a)) – TemplateRex