C++,如何在派生类中调用基类的重载提取运算符?
Posted
技术标签:
【中文标题】C++,如何在派生类中调用基类的重载提取运算符?【英文标题】:C++, How do I call a Base classes' overloaded extraction operator in a derived class? 【发布时间】:2012-01-15 17:58:18 【问题描述】:所以这是我的一个大任务的一小部分,我只是不确定它的语法。
我有一个名为 Vehicle
的基类,它有以下成员:int fuelAmt
和 int fuelUsage
)
(我正在使用命名空间std
)
我以这种方式重载了<<
运算符:
ostream& operator<<(ostream& osObject, const Vehicle& myVehicle)
cout << "Fuel Usage Rate: " << myVehicle.fuelUsage << endl
<< "Fuel Amount: " << myVehicle.fuelAmt << endl;
return osObject;
然后我这样称呼它:
cout << Vehicle;
结果是(示例):
Fuel Usage Rate: 10;
Fuel Amount: 50;
我还有一个派生自Vehicle
类的Airplane
类,它引入了一个新成员:int numEngines
。
如何在Airplane
类中重载<<
运算符,以便它首先调用“车辆重载运算符结果”,然后是我告诉<<
运算符从派生类...所以,这就是我的意思:
我需要它在 Airplane
类中像这样运行:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane)
//First print the Fuel Usage rate and Fuel amount by calling
//the Base class overloaded << function
//then
cout << "Number of Engines: " << myAirplane.numEngines << endl;
return osObject;
如何在这个派生类中触发输出其成员值的基类执行?
是否类似于更改标题?像这样:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane): operator<<Vehicle
【问题讨论】:
In operator 【参考方案1】:由于操作符
class Base
public:
virtual std::ostream& output(std::ostream& out) const
return out << "Base";
virtual ~Base() //Let's not forget to have destructor virtual
;
class Derived : public Base
public:
virtual std::ostream& output(std::ostream& out) const
Base::output(out); //<------------------------
return out << "DerivedPart";
virtual ~Derived() //Let's not forget to have destructor virtual
;
最后,只有基类的操作符
std::ostream& operator << (std::ostream& out, const Base& b)
return b.output(out);
【讨论】:
【参考方案2】:以下内容如何:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane)
osObject << static_cast<const Vehicle &>(myAirplane);
osObject << "Number of Engines: " << myAirplane.numEngines << endl;
return osObject;
【讨论】:
你应该投到const vehicle&
@ArmenTsirunyan:根据您的建议更新答案
不应该把*static_cast<Vehicle *>(this)
中的this
换成&myAirplane
吗?同样,不是Airplane.numEngines
不应该是myAirplane.numEngines
?
@yasouser:这个?这是什么?这是一个非成员函数!【参考方案3】:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane)
//First print the Fuel Usage rate and Fuel amount by calling
//the Base class overloaded << function
cout << (Vehicle& ) myAirplane;
//then
cout << "Number of Engines: " << myAirplane.numEngines << endl;
return osObject;
【讨论】:
以上是关于C++,如何在派生类中调用基类的重载提取运算符?的主要内容,如果未能解决你的问题,请参考以下文章
c ++:是不是可以在派生类中定义重载运算符,这将工作objs基类类型
c ++继承:基类中的2次重载运算符+在派生类中无法正常工作