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

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

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

16 голосов
/ 08 декабря 2011

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

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

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

std::ostream& operator << (std::ostream& out, const Base& b) 
{
    return b.output(out);
}
16 голосов
/ 08 декабря 2011

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

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

    return osObject;
}
1 голос
/ 25 марта 2013
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;
}
...