Ser*_*gey 14 c++ inheritance overriding overloading
所以这只是我所拥有的大型作业的一小部分,我只是不确定这个的语法.
我有一个名为的基类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;
}
Run Code Online (Sandbox Code Playgroud)
然后我这样称呼它:
cout << Vehicle;
Run Code Online (Sandbox Code Playgroud)
结果是(示例):
Fuel Usage Rate: 10;
Fuel Amount: 50;
Run Code Online (Sandbox Code Playgroud)
我也有一个Airplane
派生自Vehicle
类的类,它引入了一个新成员:int numEngines
.
如何<<
在Airplane
类中重载操作符,以便它首先调用"Vehicle overloaded操作符结果",然后是我告诉<<
操作符从派生类打印的结果......所以,这就是我的意思:
我需要它在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;
}
Run Code Online (Sandbox Code Playgroud)
如何在此派生类中触发输出其成员值的基类执行?
这是改变标题吗?像这样:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane): operator<<Vehicle
Run Code Online (Sandbox Code Playgroud)
Som*_*ude 16
以下内容如何:
ostream& operator<<(ostream& osObject, const Airplane& myAirplane)
{
osObject << static_cast<const Vehicle &>(myAirplane);
osObject << "Number of Engines: " << myAirplane.numEngines << endl;
return osObject;
}
Run Code Online (Sandbox Code Playgroud)
Arm*_*yan 16
由于运算符<<是非成员函数,因此您无法将其声明为虚拟,这理想情况下是您想要的.所以你做了以下几点
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
};
Run Code Online (Sandbox Code Playgroud)
最后,只有operator <<用于基类,虚拟调度将发挥其魔力
std::ostream& operator << (std::ostream& out, const Base& b)
{
return b.output(out);
}
Run Code Online (Sandbox Code Playgroud)