我想重用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)
时代码有什么问题?
答案 0 :(得分:2)
为了获得Base
的{{1}}部分,您需要转换为d
。
转换后得到的是一个临时Base&
对象,该对象不能作为非常量引用参数传递。
请注意,此强制转换仍无法使一切正常工作,例如
Base
将使用Derived d;
Base &b = d;
std::cin >> b;
重载,因为重载基于Base&
的静态类型。
为层次结构重载b
(和>>
)的一种常见方法是只有一个重载,它仅委托给虚拟成员函数。
然后,您可以覆盖派生类中的成员函数,并让动态调度负责选择适当的函数。
<<
答案 1 :(得分:1)
这样做的时候
static_cast<Base>(d);
您将获得一个Base
基值的d
前值。您不能将其传递给
friend std::istream& operator>> (std::istream &in,Base &b)
尽管它需要一个左值。您需要做的是获得对Base
的{{1}}部分的引用,而不是像
d