виртуальная функция недоступна в производном классе - PullRequest
0 голосов
/ 06 августа 2020

Следующий код не компилируется. G CC жалуется на отсутствие функции сопоставления для вызова 'производного :: print (std :: __ cxx11 :: string &).

class base
{
public:
    virtual void print(float x){}
    virtual void print(std::string str){}
};

template<class ProcessType>
class CProcess : public base
{
public:
    CProcess(ProcessType* process): m_Storage(process){}
    void print(float x) override{m_Storage->print(x);}
    void print(std::string str) override{m_Storage->print(str);}
private:
    ProcessType* m_Storage;
};

class derived: public base
{
public:
    void print(float x) override{}
    //void print(std::string str) override{}
};

base* ptr = new CProcess<derived>(new derived);
ptr->print(1.0f);

Производный класс наследует print(std::string str) от базы, так почему эта ошибка? Теперь, если я также прокомментирую void print(float x) override{} в производном, компилятор не жалуется.

Конечная цель - реализовать новое поведение для print(float x) в производном, но сохраняя поведение print(std::string str) из базы.

Я сократил производственный код до минимально возможной версии, чтобы воспроизвести проблему, поэтому не рекомендуется использовать интеллектуальные указатели и c, поскольку они находятся в производственном коде.

1 Ответ

1 голос
/ 06 августа 2020

Проблема не в том, что это virtual. Поскольку derived определяет свой собственный print, он затеняет каждую унаследованную перегрузку print.

Решение состоит в том, чтобы добавить using base::print; к derived. Убедитесь, что эта строка - public, иначе унаследованные перегрузки не будут public.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...