我有一个通用的IDetachable接口,它提供了一种方法:
template<class T>
class IDetachable {
public:
virtual T detached() const = 0;
};
我有这些示例类:
class A: public IDetachable<A> {
virtual A detached() const override {
// some implementation which returns a detached A object
}
};
继承B:
时会出现问题class B: public A, public IDetachable<B> {
virtual B detached() const override {
// some implementation which returns a detached B object
}
};
clang ++告诉我:
error: virtual function 'detached' has a different return type ('B')
than the function it overrides (which has return type 'A')
对我而言,编译器会自动选择override关键字的第一个父级。有没有机会告诉编译器我打算用override关键字继承哪个父方法?
答案 0 :(得分:6)
问题不在于如何覆盖一个或另一个事实,即你不能拥有两个具有相同签名和不同返回类型的函数。
<强>考虑:强>
template<class T, class U>
class IDetachable {
public:
virtual ~IDetachable() {}
virtual T detached() const = 0;
virtual U detached() const = 0; // whoopse problem
};
如果你最终得到两个相同的签名函数,返回不同类型并不总是非法的,这并不重要。
@AdrianMay提供了一个有效的答案。他改变了函数的签名。
答案 1 :(得分:3)
你可以传递一个虚拟T来分离:
template<class T>
class IDetachable {
public:
virtual T detached(T*dummy) const = 0;
};
您忽略该参数,但现在您可以专注于它。
答案 2 :(得分:2)
您是否只想要返回类型协方差?它仅适用于指针和引用:
template<class T>
class IDetachable {
public:
virtual T* detached() const = 0;
};
class A: public IDetachable<A> {
virtual A* detached() const override {
// some implementation which returns a detached A object
}
};
class B: public A, public IDetachable<B> {
virtual B* detached() const override {
// some implementation which returns a detached B object
}
};
int main() {
IDetachable<A> *da = new A;
A *a = da->detached();
IDetachable<B> *db = new B;
B *b = db->detached();
}