Я записал ниже кода для объяснения моей проблемы. Если я комментирую строку 11 (с ключевым словом "использование"), компилятор не компилирует файл и отображает эту ошибку: invalid conversion from 'char' to 'const char*'
. Это, кажется, не видит метод void action(char)
из Parent
класс в Son
класс.
Почему компилятор ведет себя этот путь? Или я сделал что-то не так?
class Parent
{
public:
virtual void action( const char how ){ this->action( &how ); }
virtual void action( const char * how ) = 0;
};
class Son : public Parent
{
public:
using Parent::action; // Why should i write this line?
void action( const char * how ){ printf( "Action: %c\n", *how ); }
};
int main( int argc, char** argv )
{
Son s = Son();
s.action( 'a' );
return 0;
}
Действие
, объявленное в производном классе, скрывает действие
, объявленное в базовом классе. Если вы используете действие
для объекта Son
, компилятор будет искать в методах, объявленных в Son
, найдет тот, который называется action
, и будет использовать который. Он не будет продолжать поиск в методах базового класса, поскольку уже нашел подходящее имя.
Тогда этот метод не соответствует параметрам вызова, и вы получите сообщение об ошибке.
См. Также C ++ FAQ для получения дополнительных разъяснений по этой теме.
Удивительно, но это стандартное поведение. Если производный класс объявляет метод с тем же именем, что и метод, определенный базовым классом, метод производного класса скрывает метод базового класса.