【发布时间】:2011-04-15 05:32:34
【问题描述】:
为什么如果我们在基类中有纯虚拟赋值运算符,那么我们在派生类上实现该运算符,它会在基类上给出链接器错误?
目前我对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) 和/或没有基类上的纯虚拟运算符= 声明。
在分配*bd1 = *bd2; 后没有__declspec(dllexport),d1::memberB 为1,但__declspec(dllexport) d1::memberB 保持不变
有__declspec(dllexport),并且没有纯虚声明,分配*bd1 = *bd2;后,d1::memberB 保持不变
【问题讨论】:
-
可能有助于发布一些示例代码以及 MSVC 正在吐出的完整链接器错误
-
FWIW,Scott Meyers 的 More Effective C++(“Make Non-Leaf Classes Abstract”)第 33 项介绍了如何在继承层次结构中处理 operator=。跨度>
-
@necrolis:示例代码在上面的给定链接上
-
@uray:理想情况下,关于 SO 的问题将是独立的,因为一个目的是为那些追随我们的人建立一个知识库。我已经看到 microsoft.com 上的内容随着时间的推移而消失。
-
@uray:除了 David Thornley 提到的之外,有时 MS 代码本身可能包含错误,或者只是太笼统以至于不能很好地适用于您的具体情况。我推断该示例来自您的代码,这可能有一个错误 MS 没有。
标签: c++ linker-errors operator-keyword pure-virtual