我有以下代码。
class Rectangle
{
protected:
int a, b;
public:
Rectangle(int a, int b) : a(a), b(b) {}
int area() { return a*b; }
Rectangle operator+(const Rectangle & other)
{
Rectangle temp(0, 0);
temp.a = a + other.a;
temp.b = b + other.b;
return temp;
}
void operator=(const Rectangle & other)
{
a = other.a;
b = other.b;
}
};
class Square : public Rectangle
{
public:
Square(int a) : Rectangle(a, a) {}
};
int main()
{
Square s1(3);
Square s2(1);
cout << (s1 + s2).area();
s1 = s1 + s2;
}
这个… cout << (s1 + s2).area();
可以,但在 s1 = s1 + s2;
编译器给我一个错误。
操作数=’没有匹配(操作数类型是’Square’和’Rectangle’)。
为什么这一行不能用?
解决方案:
如果你不提供一个赋值运算符,编译器会 将宣布 一个给你。在这里,编译器会生成 Square::operator=(const Square&)
. 赋值运算符从 Rectangle
会被这个操作者隐藏。你可以把 Rectangle::operator=
纳入范围,并与 using
声明:
class Square : public Rectangle
{
public:
using Rectangle::operator=;
// ...
};
现在,代码编译了,但它有缺陷。正如Konrad Rudolph、Jarod42和molbdnilo在评论中指出的那样,推导出的 Square
从 Rectangle
在逻辑上是错误的,因为它 违反 的 利斯科夫替代原理. 现在您可以指定一个 Rectangle
到 Square
,这样的分配没有意义。