Я немного пытаюсь понять, почему этот фрагмент кода не компилируется.
#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;
}
У меня есть два чисто виртуальных метода, оба названы potential
в абстрактном суперклассе A
. Подкласс 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 .
Есть идеи о том, что происходит?