我正在尝试使用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 ++的类实现之间的区别有关?我的问题是:
谢谢!
答案 0 :(得分:1)
在Java中,默认情况下方法是虚拟的。在C ++中,默认情况下,成员函数是非虚拟的。因此,要模仿Java示例,您需要在基类中声明成员函数virtual。