¿por qué si tenemos un operador de asignación virtual puro en una clase base, implementamos ese operador en la clase derivada, se da un error de enlazador en la clase base?C++: operador de asignación virtual puro
actualmente sólo tengo la siguiente explicación sobre http://support.microsoft.com/kb/130486, dijo que el comportamiento es por diseño ya las reglas de herencia normales no se aplica.
no está claro para mí, ¿por qué generar error de engarce de diseño? ¿Puede alguien darme una explicación más clara sobre esto?
edición: añadido mi código simplificado de los cuales se produjo el error:
class __declspec(dllexport) BaseClass {
public:
int memberA;
virtual BaseClass& operator=(const BaseClass& rhs) = 0;
};
class __declspec(dllexport) DerivedClass : public BaseClass {
public:
int memberB;
DerivedClass():memberB(0) {}
virtual BaseClass& operator=(const BaseClass& rhs) {
this->memberA = rhs.memberA;
this->memberB = 1;
return *this;
}
};
int main(void)
{
DerivedClass d1;
DerivedClass d2;
BaseClass* bd1 = &d1;
BaseClass* bd2 = &d2;
*bd1 = *bd2;
}
el código compilará sin errores sin__declspec(dllexport)
y/o sin operador virtual pura = declaración sobre la clase base .
sin __declspec(dllexport)
después de la asignación de *bd1 = *bd2;
, D1 :: memberB es 1, pero con __declspec(dllexport)
D1 :: memberB se deja sin cambios
con __declspec(dllexport)
, y sin declaración virtual pura, después de la asignación de *bd1 = *bd2;
, D1 :: memberB se deja sin cambios
podría ser útil para publicar un código de ejemplo junto con el error del enlazador completo MSVC escupió – Necrolis
FWIW, el artículo 33 del _More Effective C++ _ de Scott Meyers ("Hacer clases no hoja resumen") cubre cómo tratar con operator = en una jerarquía de herencia. –
@necrolis: el código de ejemplo está en el enlace indicado arriba – uray