Это на самом деле метод сокрытия, а не перегрузки.
Когда вы создаете метод с тем же именем в производном классе, версия базового класса больше не отображается.
struct A
{
void foo() {}
};
struct B : public A
{
void foo(int x) {}
};
B b;
b.foo(); //error
Я предполагаю, что вы ожидаете, что B::foo()
существует, но, как вы можете видеть, это не так. Так что ничто, ни cv-квалификаторы (const
), ни параметры не влияют на это.
В вашем случае имя не разрешено, потому что оно имеет отношение к const
, а потому что вы вызываете test
для объекта типа Child
. Затем вы вызываете Base::test()
для объекта типа Base
, как в следующем примере будет работать следующее:
((A)b).foo();