基于策略的设计中的不明确继承
Ambiguous inheritance in policy-based design
我有一个主机类,它采用两个策略,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;
}
您可能
滥用了继承,但只需在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;
}
现场示例
您可以添加一个虚拟类:
template<typename T> struct dummy : T {};
template<typename T, typename L>
class host2 : private T, private dummy<L> {
public:
void hostAction(void) {
T::doSomething();
dummy<L>::saySomething();
}
};
在某些情况下,您可能需要直接投射到L
,这应该像这样工作:
L& getL()
{
return static_cast<L&>(static_cast<dummy<L>&>(*this));
}
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 为函数定义符号不明确的指针参数
- C++ 不明确访问 - 虚拟继承
- 多重继承和访问不明确的元素
- 如何解决多次继承的不明确变量名称?
- 继承会导致不明确的转换
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++多个继承私有成员不明确访问
- 为什么常量/非常量函数重载的继承不明确
- 从具有运算符重载的模板化类继承。'operator*'的不明确重载
- c++ 不明确的双非虚函数继承
- 不明确的类继承
- 对继承的模板方法的不明确调用
- 基于策略的设计中的不明确继承
- C++ 继承错误:不明确的错误
- 继承类 c++ 中的不明确错误
- 为什么重载的继承静态函数不明确
- 当使用多重继承时,为什么这个限定名称不明确
- 为什么多重继承具有不同签名的方法是不明确的