c++ - 派生类中不可访问的虚函数
问题描述
以下代码无法编译。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 的行为。
我将生产代码剥离到尽可能小的版本以重现该问题,因此不推荐智能指针等,因为它们在生产代码中。
解决方案
问题不是由它引起的virtual
。由于derived
定义了自己的print
,它会隐藏 的每个继承的重载print
。
解决方案是添加using base::print;
到derived
. 确保这一行是public
,否则继承的重载不会是public
。
推荐阅读
- ios - 在 Swift 错误中使用 Decodable 解析 JSON
- javascript - 如何简单地加密和解密 cookie 字符串?
- redis - 带有 redis-sentinel 的 rspamd 给出超时
- java - 升级所有 kafka-pod 后,java 中的 kafka 消费者客户端无法重新连接到 kubernetes kafka 代理
- arrays - 将“If”样式条件应用于 Pandas 数据框列
- r - StMoMo 死亡率包中的完整 PLAT 模型
- reactjs - 在 TextField 中的值后显示符号
- tensorflow - 如何使用 Micro F-Measure 评估 Keras 多类模型?
- php - Codeigniter SQL Server crud 操作
- flutter - 如何转换颤振格式的日期