0

私は C++ クラスの継承を使用して Liskov Substitution Principle の違反を試みていましたが、Java プログラムで示された LSP 違反に起因する同じ問題を再現できませんでした。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. Java の LSP 違反の例を C++ で複製できますか? もしそうなら、どのように?

ありがとう!

4

1 に答える 1

1

Java では、メソッドはデフォルトで仮想です。C++ では、メンバ関数はデフォルトで非仮想です。したがって、Java の例を模倣するには、基本クラスでメンバー関数 virtual を宣言する必要があります。

于 2014-11-23T10:05:35.893 に答える