操作符的继承

我有以下代码。

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在评论中指出的那样,推导出的 SquareRectangle 在逻辑上是错误的,因为它 违反利斯科夫替代原理. 现在您可以指定一个 RectangleSquare,这样的分配没有意义。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

创建字符串时出现 "意外的T_VARIABLE"?

2022-5-12 9:00:18

解决方案

如何使用bash获取文件列表中某些字符串的列表?

2022-5-12 9:00:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索