【发布时间】:2014-12-01 12:37:49
【问题描述】:
我有一个通用的 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 关键字继承哪个父方法?
【问题讨论】:
-
这就是
override的重点——如果派生类中的函数签名与基类中的函数签名不完全相同,则会导致错误。 -
@JonathanPotter 我相信关键是他希望它覆盖
IDetachable<B>中的detached而不是A。 -
第一个基类无论如何都不是特殊的。虚函数必须正确地覆盖所有父函数。如果那不可能,您根本无法覆盖。
-
@JonathanPotter:签名确实与基类之一匹配。问题是它试图覆盖两个冲突的函数,不管有没有
override,这是一个错误。 -
正如@AdrianMay 回答的那样,您不能在它们的返回值上唯一地重载两个具有相同名称的不同函数;它们的参数列表也必须不同。需要明确的是,您不能同时拥有
A detachable()和B detachable(),因为这两者之间的唯一区别是它们的返回值;但是,您可以使用A detachable(A*)和B detachable(B*)。
标签: c++ generics inheritance