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