С++, Как мне вызвать перегруженный оператор извлечения базовых классов в производном классе?
Итак, это небольшая часть большого задания, которое у меня есть, я просто не уверен в синтаксисе для этого.
У меня есть базовый класс с именем 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;
}