首页 > 解决方案 > 派生类中不可访问的虚函数

问题描述

以下代码无法编译。GCC 抱怨没有匹配函数调用 'derived::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)in 派生的新行为,但保留print(std::string str)from base 的行为。

我将生产代码剥离到尽可能小的版本以重现该问题,因此不推荐智能指针等,因为它们在生产代码中。

标签: c++c++11templatesoverridingvirtual-inheritance

解决方案


问题不是由它引起的virtual。由于derived定义了自己的print,它会隐藏 的每个继承的重载print

解决方案是添加using base::print;derived. 确保这一行是public,否则继承的重载不会是public


推荐阅读