Я пробовал нарушения принципа подстановки Лискова с использованием наследования классов C ++, но не смог воспроизвести ту же проблему, возникающую в результате нарушения LSP, которое было продемонстрировано с помощью Java-программы. Источник программы 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;
}
Ответ был 50, как и ожидалось от класса Rectangle. Мой перевод Java неверен или это как-то связано с разницей между реализацией классов в Java и C ++? У меня есть следующие вопросы:
Спасибо!
В Java методы являются виртуальными по умолчанию. В C ++ функции-члены не являются виртуальными по умолчанию. Таким образом, чтобы имитировать пример Java, вам нужно объявить функции-члены виртуальными в базовом классе.