Почему в этом фрагменте кода C ++ не показаны нарушения принципа подстановки Лискова?

Я пробовал нарушения принципа подстановки Лискова с использованием наследования классов 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 ++? У меня есть следующие вопросы:

  1. Что вызывает эту разницу в поведении (под капотом / проблемы
    с моим кодом)?
  2. Можно ли повторить пример нарушения LSP на Java в C ++? Если так, то как?

Спасибо!

0

Решение

В Java методы являются виртуальными по умолчанию. В C ++ функции-члены не являются виртуальными по умолчанию. Таким образом, чтобы имитировать пример Java, вам нужно объявить функции-члены виртуальными в базовом классе.

1

Другие решения


По вопросам рекламы [email protected]