重载输入 重载输入派生类中的基类
Overloading input the base class inside overloading input derived class
我想在类Derived
重用Base
类中的重载输入函数。
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)
时,我的代码有什么问题?
为了得到d
的Base
部分,你需要投射到Base&
。
通过强制转换获得的是一个临时Base
对象,不能作为非常量引用参数传递。
请注意,此演员表仍然不会使一切按预期工作——例如,
Derived d;
Base &b = d;
std::cin >> b;
将使用Base&
重载,因为重载基于b
的静态类型。
重载层次结构>>
(和<<
(的常用方法是只有一个重载,它只委托给虚拟成员函数。
然后,可以重写派生类中的成员函数,并让动态调度负责选择适当的函数。
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); ... }
};
当你这样做时
static_cast<Base>(d);
你会得到一个Base
prvalue,它的基本部分是d
。 你不能把它传递给
friend std::istream& operator>> (std::istream &in,Base &b)
虽然因为它需要一个左值。 您需要做的是获取对d
Base
部分的引用,而不是像
in >> static_cast<Base&>(d);
相关文章:
- 重载运算符>>() 表示未知的输入长度/结构
- 在C++中重载输入/输出运算符
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 在类外部重载输入和输出流
- 使用函数重载输入运算符
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 函数重载并根据相同的输入返回不同的数据类型
- 重载输入 (>>) 运算符以获取枚举字符串
- c++中重载输入运算符的问题
- 试图在重载函数中获取字符和字符串的输入
- 如何将重载>>运算符中输入的值插入到资源库
- 类中的重载函数(Students())是输出输入的信息,但它不起作用
- 重载输入 重载输入派生类中的基类
- 重载输入/输出运算符,为什么它以这种方式工作而不是以另一种方式工作
- C++运算符重载输入运算符>>,将类外部的对象作为成员
- 重载输入流运算符>>
- 用指针数组重载输入操作符
- 在重载输入流时使用peek()
- 重载输入流运算符>>用于从文件中读取对象
- 重载>>输入矩阵(类)的函数不起作用