почему, если у нас есть чисто виртуальный оператор присваивания в базовом классе, тогда мы реализуем этот оператор в производном классе, он дает ошибку компоновщика в базовом классе?
в настоящее время я только есть следующее объяснение на http://support.microsoft.com/kb/130486 , там сказано, что поведение является намеренным, поскольку нормальные правила наследования не применяются .
мне непонятно, почему это создает ошибку компоновщика по дизайну? может кто-нибудь дать мне более четкое объяснение по этому поводу?
edit: добавлен мой упрощенный код , из которого произошла ошибка:
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;
}
код будет компилироваться без ошибок без __ declspec (dllexport)
и / или без чистого виртуального оператора = объявление в базовом классе.
без __declspec (dllexport)
после присвоения * bd1 = * bd2;
, d1 :: memberB равно 1, но с __ declspec (dllexport)
d1 :: memberB остается без изменений
с __ declspec (dllexport)
и без чистого виртуального объявления, после присвоения * bd1 = * bd2;
d1 :: memberB остается неизменным