Почему я должен использовать ключевое слово “использования” для доступа к моему методу базового класса?

Я записал ниже кода для объяснения моей проблемы. Если я комментирую строку 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;
}
65
задан Julien Vaslet 22 December 2011 в 16:47
поделиться

2 ответа

Действие , объявленное в производном классе, скрывает действие , объявленное в базовом классе. Если вы используете действие для объекта Son , компилятор будет искать в методах, объявленных в Son , найдет тот, который называется action , и будет использовать который. Он не будет продолжать поиск в методах базового класса, поскольку уже нашел подходящее имя.

Тогда этот метод не соответствует параметрам вызова, и вы получите сообщение об ошибке.

См. Также C ++ FAQ для получения дополнительных разъяснений по этой теме.

55
ответ дан 24 November 2019 в 15:31
поделиться

Удивительно, но это стандартное поведение. Если производный класс объявляет метод с тем же именем, что и метод, определенный базовым классом, метод производного класса скрывает метод базового класса.

См. Часто задаваемые вопросы по C ++

16
ответ дан 24 November 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: