为什么如果我们在基类中有纯虚拟赋值运算符,那么我们在派生类上实现该运算符,它会在基类上给出链接器错误?
目前我在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;
}
如果没有 __declspec(dllexport)
和/或没有基类上的纯虚拟运算符 = 声明,代码将无错误地编译。
没有__declspec(dllexport)
赋值后*bd1 = *bd2;
,d1::memberB 为 1,但__declspec(dllexport)
d1::memberB 保持不变
有__declspec(dllexport)
, 和没有纯虚声明,在赋值后*bd1 = *bd2;
d1::memberB 保持不变