2011-07-05 9 views
7

serializo la mayoría de mis clases con dos funciones, leer() y escribir(). Lo que me gustaría hacer es tener la función de lectura/escritura() de la clase base llamada desde las subclases para que no tenga que repetir el código de serialización varias veces.Cómo llamar a la función original después de haber sido anulada en C++?

Por ejemplo:

class Base 
{ 
public: 
    base(); 
    virtual read(QDataStream&); 
    virtual write(QDataStream&); 
private: 
    int a, b, c, d; 
} 

class Sub : public Base 
{ 
public: 
    Sub(); 
    read(QDataStream&); 
    write(QDataStream&); 
private: 
    int e, f, g, h; 
} 

lo tanto, en este ejemplo, me gustaría que el código para leer/escribir a, b, c, d que venir de Base. Sub llamaría Base :: read (QDataStream &) y luego agregaría los atributos que sean exclusivos de Sub. De esta forma no tengo que repetir el código de serialización para cada subclase (y posiblemente me olvide de hacerlo).

+6

Tenga en cuenta que esto se llama en realidad "anulando" un método. La "sobrecarga" es cuando tiene varios métodos que tienen el mismo nombre pero que toman diferentes tipos de argumentos. Por ejemplo, una clase de cadena puede sobrecargar operador +() para dar el operador + significado cuando las cadenas están involucradas. – Caleb

+0

Debería intentar corregir los ejemplos. A las funciones miembro les faltan los tipos de devolución, el tipo se llama 'Base', pero parece que hay un constructor' base' ... –

+0

gracias por la clarificación de Caleb. – jecjackal

Respuesta

17

Puede llamar a las funciones de la clase base anteponiendo la llamada de función con el identificador de la clase base, seguido por el operador de ámbito (: :).

De esta manera:

class Base 
{ 
public: 
    virtual void Function(); 
} 

class Foo : public Base 
{ 
public: 
    void Function(); 
    void DoSomething(); 
} 

void Foo::DoSomething() 
{ 
    Base::Function(); // Will call the base class' version of Function(). 
    Function();   // Will call Foo's version of Function(). 
} 

EDIT: Nota eliminado por petición.

+5

Por favor, elimine toda la * nota añadida *, está completamente fuera del tema, y ​​peor: incorrecto. La lista de inicializadores y las llamadas a función de miembro calificadas no están relacionadas por completo. Ni siquiera tienen la misma sintaxis, lo único en común es que el nombre del tipo base aparece en algún lugar del código. –

+0

Gracias por la completa explicación – jecjackal

+0

@David: Me gustaría señalar que el código en la nota se compilaría y hace lo que le expliqué que haría. Sin embargo, lo eliminé, ya que estoy de acuerdo en que no era tópico (como mencioné en la respuesta). Estaba bajo la suposición de que no había daño al tratar de proporcionar información adicional que estaba relacionada (aunque no completamente), si mencioné claramente el punto en la publicación donde finalizó la respuesta exacta y se inició la información adicional (como fue el caso) . – Rycul

9
void Sub::read(QDataStream &stream) 
{ 
    Base::read(stream); 
    // do Sub stuff here 
} 
6

Primero, sus funciones miembro no tienen tipos de devolución, no son válidas en C++, su compilador puede quejarse sobre el comportamiento 'default int' y dejarlo pasar, pero debe darles los tipos devueltos (usaré void como marcador de posición).

puede resolver alcance y utilizar la versión de la clase padre cuando estás en una subclase:

void Sub::read(QDataStream& qds) { 
    Base::read(qds); 

    // do more stuff 
} 
+0

Esto funciona genial, gracias – jecjackal

Cuestiones relacionadas