我有一个主机类,它采用两个策略:sayhello
和talk
。策略 talk
是一个类模板,它本身采用例如打个招呼
。
问题是 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;
}
最佳答案
您可能滥用继承,但只需在 talk
和 host2
中添加几个 virtual
关键字即可:
#include <iostream>
class sayhello {
protected:
void saySomething(void) {
std::cout<<"Hello!"<<std::endl;
}
};
template<typename T>
class talk : virtual 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 : virtual T, virtual 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;
}
关于c++ - 基于策略的设计中的模糊继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471868/