C++, Как вызвать перегруженный оператор извлечения базовых классов в производном классе?

Итак, это небольшая часть большого задания, которое у меня есть, я просто не уверен в синтаксисе для этого.

у меня есть базовый класс с именем 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;

я тоже есть Airplane класс, производный от Vehicle класса, он вводит нового члена: 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

3 ответов


Как насчет следующего:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane)
{
    osObject << static_cast<const Vehicle &>(myAirplane);
    osObject << "Number of Engines: " << myAirplane.numEngines << endl;

    return osObject;
}

поскольку оператор

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);
}

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;
}