2011-12-08 15 views
14

Jest to niewielka część dużego zadania, które mam, ale nie jestem pewien składni tego.C++, Jak mogę wywołać przeciążony operator wyodrębniania klas klasy pochodnej?

Mam klasy bazowej o nazwie Vehicle, który ma tych członków: int fuelAmt i int fuelUsage)

(używam nazw std)

I przeciążone << operatora w ten sposób:

ostream& operator<<(ostream& osObject, const Vehicle& myVehicle) 
{ 
    cout << "Fuel Usage Rate: " << myVehicle.fuelUsage << endl 
     << "Fuel Amount:  " << myVehicle.fuelAmt << endl; 

    return osObject; 
} 

Następnie nazywam to w ten sposób:

cout << Vehicle; 

Powoduje to (przykład):

Fuel Usage Rate: 10; 
Fuel Amount: 50; 

również posiadać klasę Airplane pochodzący z klasy Vehicle, wprowadza się nowy element: int numEngines.

Jak mogę przeciążać operatora << w klasie Airplane, tak, że będzie to pierwszy nazywają „pojazd przeciążony wyników Operator”, a następnie wyniki cokolwiek powiedzieć operatorowi << drukowanie z klasy pochodnej ... tak więc, oto co mam na myśli:

muszę to funkcjonować tak w klasie 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; 
} 

Jak mogę wyzwolić wykonanie klasy bazowej reprodukcji wartości swoich członków, w tym klasy pochodnej?

Czy zmienia się nagłówek? Tak:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane): operator<<Vehicle 
+1

W operatora << dla pojazdów piszesz cout. Powinieneś napisać do osObject. – user763305

Odpowiedz

16

jak o następujących:

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

    return osObject; 
} 
+0

powinieneś rzucić na "const vehicle &" –

+0

@ArmenTsirunyan: Zaktualizowana odpowiedź z twoją sugestią –

+0

Czy nie należy "this" w '* static_cast (this)' zastąpić '& myAirplane'? Podobnie, zamiast "Airplane.numEngines" nie powinno to być 'myAirplane.numEngines'? – yasouser

16

ponieważ operator < < to funkcja nie będących członkami, nie można zadeklarować wirtualny, który jest idealnie, co chcesz. Więc należy wykonać następujące czynności

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

i wreszcie mieć operatora < < tylko dla klasy bazowej i wirtualnego wysłania zadziała swoją magiczną

std::ostream& operator << (std::ostream& out, const Base& b) 
{ 
    return b.output(out); 
} 
1
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; 
} 
Powiązane problemy