2011-01-19 8 views
25

¿El siguiente patrón es correcto/seguro? ¿O hay alguna deficiencia? (también lo utilizan para operadores de igualdad)llamando a operadores de clase base ... ¿seguros?

Derived& operator=(const Derived& rhs) 
{ 
    static_cast<Base&>(*this) = rhs; 
    // ... copy member variables of Derived 
    return *this; 
} 

Respuesta

38

Esto está muy bien, pero es un montón en mi humilde opinión más legible para llamar a la clase base por su nombre:

Base::operator = (rhs); 
+0

de hecho ... Acabo de notar que esta notación trabaja para definido implícitamente aswell operadores de asignacion (siempre pensó que sólo trabajaría para explícitamente definidos unos) – smerlin

12

Sí, es seguro.

Una sintaxis diferente para hacer lo mismo podría ser:

Base::operator=(rhs); 
+0

realidad esta es una manera mejor, entonces necesidad de emitir. Además, esto debería hacerse en las clases derivadas –

1

Eso es mejor usar

Base::operator=(rhs); 

porque si su clase base tiene un método virtual puro no se permite que el static_cast.

class Base { 
    // Attribute 
    public: 
     virtual void f() = 0; 
    protected: 
     Base& operator(const Base&); 
} 

class Derived { 
    public: 
     virtual void f() {}; 
     Derived& operator=(const Derived& src) { 
      Base::operator=(src); // work 
      static_cast<Base&>(*this) = src; // didn't work 
     } 
} 
Cuestiones relacionadas