运算符<<在派生类 C++ 中
operator<< in derived classes c++
我对派生类中的操作符<<
有一个问题,例如:
如果我有
class Base
{
//......
friend ostream& operator<<(ostream& out,Base &B)
{
return out<<B.x<<B.y<</*........*/<<endl;
}
//......
};
是可能的吗?
class Derived: public Base
{
//......
friend ostream& operator<<(ostream& out,Derived &DERIVEDOBJECT)
{
return out<<DERIVEDOBJECT<<DERIVEDOBJECT.nonderivedvar1 <</*.....*/<< endl;
}
}
或将DERIVEDOBJECT
放在<<
操作符中不会导致<<
将其识别为仅对基类的引用?
您通常需要这样的内容:
class Base {
virtual std::ostream &write(std::ostream &os) {
// write *this to stream
return os;
}
};
std::ostream &operator<<(std::ostream &os, Base const &b) {
return b.write(os);
}
然后在必要时,派生类重写write
。
这将导致递归调用:
out<<DERIVEDOBJECT
我会这样做:
friend ostream& operator(ostream& out,Derived &DERIVEDOBJECT)
{
return out << static_cast<Base&>(DERIVEDOBJECT)
<< DERIVEDOBJECT.nonderivedvar1
<<.....<< endl;
}
p。空格和小写字母是你的朋友。
按照惯例,所有大写的标识符都是宏,所以如果对普通变量使用所有大写的标识符,可能会让人感到困惑。
您可以通过将提升为基本类型来实现预期的结果:
struct base {};
std::ostream& operator<<( std::ostream& o, base const & b ) {
return o << "base";
};
struct derived : base {};
std::ostream& operator<<( std::ostream& o, derived const & d ) {
return o << static_cast<base&>(d) << " derived";
}
int main() {
derived d;
std::cout << d << std::endl; // "base derived"
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”