【发布时间】:2021-07-03 13:59:07
【问题描述】:
假设我们有 2 个类:
class base{
protected:
char first_name;
public:
/// constructors , destructor, operator= overloading ...
friend istream& operator >> (istream& in, base &client1)
{
char f_name[1001];
cout << "First Name: ";
in >> f_name;
client1=base(f_name); /// class parameterised constructor;
return in;
}
};
class derived: public base{
protected:
char last_name[1001];
public:
/// constructors , destructor, operator= overloading ...
friend istream& operator >> (istream& in, derived &client2)
{
char l_name[1001], f_name[1001];
in >> (base) client2; /// it's not working like it dose in operator<<..
cout << "Last Name: ";
is >> l_name;
client2=derived(f_name, l_name); /// class parameterized constructor, 2 parameters because it use base constructor as well;
return in;
}
};
我重载了一些输出运算符(中调用运算符我不知道这对于操作员>中调用基类运算符>>时,它给了我错误:
" 没有匹配函数调用 'operator>>(std::istream&, abonament)'| "
同样,如果我在 operator
friend ostream& operator << (ostream& out, derived &client)
{
out << (base) client; /// it's working;
out << client.last_name;
return in;
}
是否可以在派生类运算符中调用基类运算符>>> 为什么会发生这种情况以及如何解决? (我希望我不必在派生类运算符>>中再次重写基类运算符>>中的相同行)
【问题讨论】:
-
char first_name;可能会带来悲伤。很少有人有一个字母的名字。 -
警告:
(base) client2;将slice。想一想,这可能是你的问题。 -
投射到参考:
(base&)client2;. -
我通常强调可重现性,但实际上两者同等重要。如果您提供了大量代码,那么您并没有真正尝试隔离问题。如果在运行给定代码时问题无法重现,则更难正确检查您的错误并证明提出的答案确实解决了问题。
-
minimal reproducible example 的真正价值在于它是一种强大的调试技术。通常,制作 MRE 的行为会减少 bug 周围的噪音,以至于您可以在完成 MRE 之前很久就看到并发现 bug。如果您在问题编写过程的早期进行 MRE,您通常可以停止编写问题。
标签: c++ class input output overloading