Pol*_*lem 9 c++ generics inheritance
我有一个通用的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关键字继承哪个父方法?
问题不在于如何覆盖一个或另一个事实,即您不能拥有具有相同签名和不同返回类型的两个函数.
考虑:
template<class T, class U>
class IDetachable {
public:
    virtual ~IDetachable() {}
    virtual T detached() const = 0;
    virtual U detached() const = 0; // whoopse problem
};
无论你如何最终得到两个相同的签名函数返回不同的类型,它总是非法的.
@AdrianMay提供了一个有效的答案.他改变了函数的签名.
您可以传递一个虚拟 T 来分离:
template<class T>
class IDetachable {
public:
  virtual T detached(T*dummy) const = 0;
};
您忽略该参数,但现在您可以专注于它。