2011-12-08 16 views
14

Así que esta es una pequeña parte de una gran tarea que tengo, no estoy seguro de la sintaxis para esto.C++, ¿cómo puedo llamar a un operador de extracción sobrecargado de las clases Base en una clase derivada?

que tienen una clase base denominada Vehicle, que tiene estos miembros: int fuelAmt y int fuelUsage)

(estoy usando espacio de nombres std)

que sobrecarga el << operador de esta manera:

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

    return osObject; 
} 

Lo llamo así:

cout << Vehicle; 

El resultado es (ejemplo):

Fuel Usage Rate: 10; 
Fuel Amount: 50; 

También he una clase Airplane que deriva de la clase Vehicle, se introduce un nuevo miembro: int numEngines.

Como puedo sobrecargar el operador << en la clase Airplane, por lo que primero le llamará el "vehículo sobrecargado resultados operador", y luego los resultados de lo que sea que decirle al operador << imprimir desde la clase derivada ... por lo tanto, esto es lo que quiero decir:

necesito que funcione como esta en la clase 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; 
} 

¿Cómo activar la ejecución de la clase base de dar salida a los valores de sus miembros, en esta clase derivada?

¿Es algo así como cambiar el encabezado? De esta manera:

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

En operador << para el vehículo que se escribe en cout. Debería escribir en osObject. – user763305

Respuesta

16

¿Qué hay de lo siguiente:

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

    return osObject; 
} 
+0

debe convertir a 'const vehicle &' –

+0

@ArmenTsirunyan: respuesta actualizada con su sugerencia –

+0

¿No debería el 'this' en' * static_cast (this) 'ser reemplazado por' & myAirplane'? Del mismo modo, en lugar de 'Airplane.numEngines', ¿no debería ser' myAirplane.numEngines'? – yasouser

16

Dado que el operador < < es una función que no es miembro, no se puede declarar que virtual, que está muy bien lo que quiere. Así que hacer lo siguiente

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

y, finalmente, tener operador < < sólo para la clase base y el envío virtual funcionará su magia

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