如何在C++中将override关键字用于多个通用继承?

Pol*_*lem 9 c++ generics inheritance

我有一个通用的IDetachable接口,它提供了一种方法:

template<class T>
class IDetachable {
public:
  virtual T detached() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

我有这些示例类:

class A: public IDetachable<A> {
  virtual A detached() const override {
    // some implementation which returns a detached A object
  }
};
Run Code Online (Sandbox Code Playgroud)

继承B时会出现问题:

class B: public A, public IDetachable<B> {
  virtual B detached() const override {
    // some implementation which returns a detached B object
  }
};
Run Code Online (Sandbox Code Playgroud)

clang ++告诉我:

error: virtual function 'detached' has a different return type ('B')
  than the function it overrides (which has return type 'A')
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎编译器会自动选择override关键字的第一个父级.有没有机会告诉编译器我打算用override关键字继承哪个父方法?

Gal*_*lik 6

问题不在于如何覆盖一个或另一个事实,即您不能拥有具有相同签名和不同返回类型的两个函数.

考虑:

template<class T, class U>
class IDetachable {
public:
    virtual ~IDetachable() {}
    virtual T detached() const = 0;
    virtual U detached() const = 0; // whoopse problem
};
Run Code Online (Sandbox Code Playgroud)

无论你如何最终得到两个相同的签名函数返回不同的类型,它总是非法的.

@AdrianMay提供了一个有效的答案.他改变了函数的签名.


Adr*_*May 3

您可以传递一个虚拟 T 来分离:

template<class T>
class IDetachable {
public:
  virtual T detached(T*dummy) const = 0;
};
Run Code Online (Sandbox Code Playgroud)

您忽略该参数,但现在您可以专注于它。