2012-04-09 14 views

Respuesta

11

El operador de asignación de copias se genera automáticamente en la clase derivada. Esto provoca que el operador de asignación de la clase base esté oculto debido a las reglas de ocultación de nombre regular de C++. Puede mostrar el nombre en la clase base a través de la directiva "using". Por ejemplo:

class C 
{ 
    public: 
    void operator =(int i) {} 
}; 

class SubC : public C 
{ 
    public: 
    using C::operator=; 
}; 
+1

O llámelo directamente 'subC.C :: operator = (0);' –

2

Un operador de asignación de copias para una clase base no tiene la firma requerida para un operador de asignación de copias para una clase derivada. Es heredado por la clase derivada, pero no constituye un operador de asignación de copia en él. Por lo tanto, aunque los operadores de asignación son heredados, al igual que otras funciones miembro, no proporciona asignación de copias.

+4

Eso no es cierto en general. Por ejemplo, operator + puede ser heredado. –

1

no he hecho, pero de acuerdo con The Man Himself (BS) es una característica de C++ 11 para hacerlo con los constructores, pero ha sido en desde C++ 98 para hacerlo con otros métodos.

Esto se ha traducido directamente desde el enlace:

People sometimes are confused about the fact that ordinary scope rules apply to class members. In particular, a member of a base class is not in the same scope as a member of a derived class:

struct B { 
    void f(double); 
}; 

struct D : B { 
    void f(int); 
}; 

B b; b.f(4.5); // fine 
D d; d.f(4.5); // surprise: calls f(int) with argument 4 

In C++98, we can "lift" a set of overloaded functions from a base class into a derived class:

struct B { 
    void f(double); 
}; 

struct D : B { 
    using B::f;  // bring all f()s from B into scope 
    void f(int); // add a new f() 
}; 

B b; b.f(4.5); // fine 
D d; d.f(4.5); // fine: calls D::f(double) which is B::f(double) 

Así que ya va. Probablemente pueda "tomarlo si lo desea" incluso antes de C++ 11, aunque yo mismo no lo he probado.

0

Excepto el operador de copia de asignación, otro operador sobrecargado se puede heredar.

Estoy de acuerdo la opinión de que por defecto construida copia-asignación de SubC eclipsa operador de asignación sobrecargado de C.

Si SubC no proporcionan un operador de copia-asignación, compilador SYNTHESE una operación de copiar la asignación, como siga:

class SubC : public C 
{ 
public: 
    SubC & operator=(const SubC & other); 
} 

entonces el 'SubC & operador = (const SubC & otro)' eclipsa operador de asignación de C, resultados en error de compilación.

Si

SubC other; 
SubC subC; 

subC = other; 

entonces, este caso, compilar bien.

Cuestiones relacionadas