派生中无法访问虚函数 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
.
以下代码无法编译。 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
.
解决方法是将using base::print;
添加到derived
。确保这一行是 public
,否则继承的重载不会是 public
.