почему, если у нас есть чистый виртуальный оператор присваивания в базовом классе, то мы реализуем этот оператор в производном классе, это дает ошибку компоновщика в базовом классе?
в настоящее время у меня есть только следующее объяснение 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 остается без изменений