我有点迷失在C++运营商。我想执行的赋值操作符的两个不同的类,即这样一个可以指定一个彼此:为什么我不能有一个纯粹的虚拟赋值操作符?
class A {
public:
virtual A &operator =(const A &a) = 0;
};
class B : public A {
public:
virtual A &operator =(const A &a) override {
std::cout << "B" << std::endl;
return *this;
}
};
class C : public A {
public:
virtual A &operator =(const A &a) override {
std::cout << "C" << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
B b;
C c;
b = c;
// leads to a linker error: undefined reference to `A::operator=(A const&)'
//B b2;
//b = b2;
}
的第一项任务,似乎做的工作,“B”之称。类似地,对于“c = b”,调用“C”。但是,当我取消注释第二部分时,我收到链接器错误。如果我将A的运营商定义为:
virtual A &operator =(const A &a) {
std::cout << "A" << std::endl;
return *this;
}
我得到“B”,“A”。咦?有人可以解释为什么当分配两个B时需要“A”,但是当B不是时B?
你认识到,编译器也为B和C的一个默认的拷贝构造函数,以及默认NON VIRTUAL B ::运算符=(常数B&)和C ::运算(常量C&)操作符....创建虚拟(甚至非虚拟)赋值操作符从基到派生是要求麻烦的。 –
这不是问题,但是你真的需要'std :: endl'做的额外的东西吗? ''\ n''结束一行。 –