C++,如何在派生类中调用Base类的重载提取运算符?

Ser*_*gey 14 c++ inheritance overriding overloading

所以这只是我所拥有的大型作业的一小部分,我只是不确定这个的语法.

我有一个名为的基类Vehicle,它有以下成员:int fuelAmtint 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)