C ++: чисто виртуальный оператор присваивания

почему, если у нас есть чисто виртуальный оператор присваивания в базовом классе, тогда мы реализуем этот оператор в производном классе, он дает ошибку компоновщика в базовом классе?

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

6
задан Kara 28 June 2013 в 23:53
поделиться