基本クラスに純粋な仮想代入演算子がある場合、その演算子を派生クラスに実装すると、基本クラスでリンカー エラーが発生するのはなぜですか?
現在、 http://support.microsoft.com/kb/130486に次の説明しかありません。通常の継承規則が適用されないため、動作は設計によるものであるとのことです。
私には明確ではありませんが、設計によりリンカーエラーが生成されるのはなぜですか? 誰かがこれについてもっと明確な説明をくれますか?
編集:エラーが発生した簡略化されたコードを追加しました:
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;
}
コードは、基本クラスでの純粋な仮想 operator= 宣言の有無にかかわらず、エラーなし でコンパイルされます。__declspec(dllexport)
__declspec(dllexport)
の割り当て後、d1:: memberB*bd1 = *bd2;
は 1 ですが、__declspec(dllexport)
d1::memberB がある場合は変更されません。
を使用し__declspec(dllexport)
、pure virtual 宣言を使用しない場合、 の代入後*bd1 = *bd2;
、d1::memberB は変更されません。