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

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

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

Ответы

Ответ 1

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

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

    return osObject;
}

Ответ 2

Так как оператор < является функцией nonmember, вы не можете объявить ее виртуальной, что идеально, что вы хотите. Итак, вы делаете следующее

class Base
{
public:
    virtual std::ostream& output(std::ostream& out) const
    {
        return out << "Base";
    }
    virtual ~Base() {} //Let 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 not forget to have destructor virtual
};

и, наконец, иметь оператор < < только для базового класса, и виртуальная диспетчеризация будет работать с магией

std::ostream& operator << (std::ostream& out, const Base& b) 
{
    return b.output(out);
}

Ответ 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;
}