【发布时间】:2017-12-10 02:33:38
【问题描述】:
我对 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 和 C 创建了默认的复制构造函数,以及默认的 NON VIRTUAL B::operator=(const B&) 和 C::operator(const C&) 运算符.... 创建从基到派生的虚拟(甚至非虚拟)赋值运算符是自找麻烦。
-
这不是问题,但您真的需要
std::endl需要的额外内容吗?'\n'结束一行。
标签: c++ operator-overloading assignment-operator