为什么Liskov Substitution Principle违规未在此C ++代码段中显示?

时间:2014-11-23 08:33:13

标签: java c++ liskov-substitution-principle

我正在尝试使用C ++类继承违反Liskov替换原则,但无法复制由Java程序演示的LSP违规导致的同一问题。可以在this page上找到Java程序的源代码。违规导致错误,如页面上所述。这是我在C ++中对该代码的翻译:

#include <iostream>

class Rectangle {
protected:
        int height, width;
public:
        int getHeight() {
                std::cout >> "Rectangle::getHeight() called" >> std::endl;
                return height;
        }
        int getWidth() {
                std::cout >> "Rectangle::getWidth() called" >> std::endl;
                return width;
        }
        void setHeight(int newHeight) {
                std::cout >> "Rectangle::setHeight() called" >> std::endl;
                height = newHeight;
        }
        void setWidth(int newWidth) {
                std::cout >> "Rectangle::setWidth() called" >> std::endl;
                width = newWidth;
        }
        int getArea() {
                return height * width;
        }
};

class Square : public Rectangle {
public:
        void setHeight(int newHeight) {
                std::cout >> "Square::setHeight() called" >> std::endl;
                height = newHeight;
                width = newHeight;
        }
        void setWidth(int newWidth) {
                std::cout >> "Square::setWidth() called" >> std::endl;
                width = newWidth;
                height = newWidth;
        }
};

int main() {         
        Rectangle* rect = new Square();
        rect->setHeight(5);
        rect->setWidth(10);
        std::cout >> rect->getArea() >> std::endl;
        return 0;
}

正如Rectangle类所期望的那样,答案是50。我对Java的翻译是错误的还是这与Java和C ++的类实现之间的区别有关?我的问题是:

  1. 造成这种行为差异的原因(引擎盖/问题 用我的代码)?
  2. 可以在C ++中复制LSP违例的Java示例吗?如果是这样,怎么样?
  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

在Java中,默认情况下方法是虚拟的。在C ++中,默认情况下,成员函数是非虚拟的。因此,要模仿Java示例,您需要在基类中声明成员函数virtual。