c++ - 在重载输入派生类中重载输入基类
问题描述
我想重用Base
类内部Derived
类的重载输入函数。
class Base
{
private:
int m_value;
public:
Base(int value)
: m_value(value)
{
}
friend std::istream& operator>> (std::istream &in,Base &b)
{
in>>b.m_value;
return in;
}
};
class Derived : public Base
{
std::string id;
public:
Derived(int value,std::string id)
: Base(value),id(id)
{
}
friend std::istream& operator>> (std::istream &in,Derived &d)
{
in>>static_cast<Base>(d);//not work
in>>d.id;
return in;
}
};
我写的代码有什么问题in>>static_cast<Base>(d)
?
解决方案
为了获得 的Base
部分d
,您需要转换为Base&
。
你的演员得到的是一个临时Base
对象,它不能作为非常量引用参数传递。
请注意,此演员阵容仍然无法使一切都按您的预期工作——例如,
Derived d;
Base &b = d;
std::cin >> b;
将使用Base&
重载,因为重载是基于b
.
>>
对层次结构重载(and ) 的一种常见方法<<
是只有一个重载,它只是委托给一个虚拟成员函数。
然后,您可以覆盖派生类中的成员函数,并让动态调度负责选择适当的函数。
struct Base
{
virtual void read(std::istream& is) { ... }
};
std::istream& operator>> (std::istream &in, Base &b)
{
b.read(in);
return in;
}
struct Derived: Base
{
void read(std::istream& is) override { Base::read(is); ... }
};
推荐阅读
- android - 如何使用 Kotlin 在片段内播放 YouTube 视频
- java - 构造函数中的对象创建链接 wrt 继承
- apache-kafka - 即使 Kafka 连接断开,应用程序也应该继续运行
- javascript - 我想验证用户的伪在他写作时是否良好
- sql - 日期范围之间的日期范围
- javascript - 使用 Gremlin Javascript 在 JanusGraph 中创建和查询 Geopoint
- terraform - Terraform 在初始化期间将资源列为提供者
- ios - 为 iOS 12 开发的应用程序可以安装在 iPadOS 上吗
- python - Pandas:如何从 google drive public 读取 CSV 文件?
- javascript - 推断嵌套的通用参数并从函数中返回它