如何在C ++中使用override关键字进行多个通用继承?

时间:2014-10-07 06:40:38

标签: 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关键字继承哪个父方法?

3 个答案:

答案 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();
}