我有点难以理解为什么这段代码片段不能编译。
#include <cstdio>
class A {
public:
virtual int potential()=0;
virtual int potential(int arg, int arg2)=0;
};
class B : public A {
public:
int potential() { return 1; }
virtual int potential(int arg, int arg2) { return 2; }
};
class C : public B {
public:
int potential(int arg, int arg2) { return 3; }
};
int main(int argc, char** argv) {
C c;
int value = c.potential();
printf("Got %i\n", value);
return 0;
}
我有两个纯虚方法,在抽象超类A
中都命名为potential
。然后子类B
定义了这两个方法,但进一步的子类C
只需要重新定义其中一个方法。
然而,在编译时,只有在C
中定义的方法被识别,而potential()
没有被看到(这应该已经从B
继承):
In function 'int main(int, char**)':
Line 23: error: no matching function for call to 'C::potential()'
compilation terminated due to -Wfatal-errors.
如果我将整个继承树中的 A::potential(int, int)
重命名为其他名称,例如 A::somethingElse(int, int)
,则代码可以成功编译,并且输出结果为 Got 1
,符合预期。这已经通过 clang、g++ 和 MSVC 的 cl 进行了验证。对此有什么想法吗?
<cstdio>
。 - Dan