【发布时间】:2013-08-30 09:19:21
【问题描述】:
我想创建一个实现两个接口的类,这两个接口具有相同名称的函数,只是它们的返回值不同。我怎样才能正确地做到这一点?
template<class T>
class IBase
{
public:
virtual T Method() = 0;
};
class Derived : public IBase<int>, public IBase<char> {
public:
int _value;
virtual int IBase<int>::Method();
virtual char IBase<char>::Method();
};
int Derived::Method() {
return _value;
}
char Derived::Method() {
return _value;
}
这是我得到的错误:
error C2555: 'Derived::Method: overriding virtual function return type differs and is not covariant from 'IBase<int>::Method
error C2556: 'int Derived::Method(void)' : overloaded function differs only by return type from 'char Derived::Method(void)'
error C2371: 'Derived::Method: redefinition; different basic types
error C2084: function 'char Derived::Method(void)' already has a body
在 C# 中,使用几乎相同的语法(称为显式接口实现)很容易做到这一点,没有任何歧义:
class Derived : IBase<int>, IBase<char> {
int _value;
int IBase<int>.Method() {
return _value;
}
char IBase<char>.Method();
return _value;
}
};
显式实现是私有的,因此不能直接用于Derived 类的变量。它们仍然非常有用,因为您可以将 Derived 强制转换为接口之一以使用实现:
var d = new Derived();
((IBase<int>)d).Method();
这可能非常有用。一个类可以多次实现 ICanConvertTo 以启用不同的转换。
【问题讨论】:
-
顺便说一句,GCC 给出了不同的错误:ideone.com/3f0ZVG (
cannot declare member function ‘IBase<int>::Method’ within ‘Derived’和char相同,而不是int,然后no ‘int Derived::Method()’ member function declared in class ‘Derived’和char相同,而不是 @ 987654334@) -
@gx_ 你删除了你的评论吗?我觉得挺好用的。
-
是的,我做到了,因为我意识到这实际上不是同一个问题(您的返回类型不同)。无论如何,既然你问了=)这个问题有点相关:stackoverflow.com/questions/18398409/…(在模板实例化之后,
IBase<int>和IBase<char>是两个不同的不相关的类) -
我认为你是对的,返回类型的差异并不重要。重要的是名称和签名相同(不好),但完全限定的名称和插槽不同(本可以救我)。
标签: c++ templates inheritance multiple-inheritance