派生中无法访问虚函数 class

virtual function not accessible in derived class

以下代码无法编译。 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);

Class derived inherits print(std::string str) from base 为什么会出现这个错误?现在,如果我也在派生中评论 void print(float x) override{},编译器不会抱怨。

最终目标是在 derived 中为 print(float x) 实现新的行为,但保持 print(std::string str) 的行为与 base.

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

问题不是由 virtual 引起的。由于 derived 定义了它自己的 print,它隐藏了 print.

的每个 inherited 重载

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