why if we have pure virtual assignment operator in a base class, then we implement that operator on the derived class, it give linker error on the base class?
currently I only have the following explanation on http://support.microsoft.com/kb/130486 , it said that the behavior is by design since normal inheritance rules does not apply.
it is not clear for me, why is it generate linker error by design? can someone give me more clear explanation about this?
edit: added my simplified code of which the error occured:
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;
}
the code will compile with no errors without __declspec(dllexport)
and/or without pure virtual operator= declaration on base class.
without __declspec(dllexport)
after assignment of *bd1 = *bd2;
, d1::memberB is 1, but with __declspec(dllexport)
d1::memberB is left unchanged
with __declspec(dllexport)
, and without pure virtual declaration, after assignment of *bd1 = *bd2;
, d1::memberB is left unchanged
From section 12.8 of the standard:
The subclass is using the implicitly-defined copy assignment operator, and there is no definition of the base class's copy assignment operator, but it is declared, so you get a link error instead of a compilation error.
operator= is not inherited. Your code is meaningless in C++, so compilers are free to issue any error they want for it.
From the KB article you pointed to: http://support.microsoft.com/kb/130486
It's probably just a side-effect of how they compile, and they are just letting you know that they don't consider it a bug, so there is no need to fix it. "By design" doesn't necessarily mean that they specifically decided that this linker error is the right error message to give for this situation -- the code is wrong, you get an error, so from their point of view -- they're done.
In the example code:
the line
aB2 = aB1
does not callconst A& B::operator=(const A&)
, but instead calls the automatically suppliedB& operator=(const B&);
which in turn uses the assignment operator for assigning the base portion of the class. But when it comes to linking, it turns out that that was never implemented.