7

次のコードを検討してください。


class A
{
public:
    virtual void f() throw ( int ) { }
};

class B: public A
{
public:
    void f() throw ( int, double ) { }
};

コンパイルすると、派生クラス B は A に比べてスロー指定子が緩いことが示されます。これの重要性は何ですか? A::f() が int と double をスローし、B::f() が int のみをスローするように例外仕様を交換しようとすると、エラーは表示されません。

4

2 に答える 2

14
  1. C++では例外仕様を使用しないでください。これは、たとえばJavaのものと比較して非常に直感的ではありません。
  2. 派生クラスでより広い仕様を持つと、LSP(Liskov Substitution Principle)が破られます。

ポイント2を拡張するために:の発信者はそれが出てくるAことだけを期待しますが、 (これは、から公開されているため、としても使用できることを意味します)を使用すると、突然出てくる可能性があり、それはの契約を破ることになります(それはスローされるだけです)。intBAAdoubleAint

于 2010-03-05T15:08:47.117 に答える
1

あなたの B は Liskov Substitution Principle に違反しています - 例:

void foo(A* a) throw() // つまり、スローしません
{
  試す
  {
     a->f();
  }
  キャッチ(整数)
  {}
}

これは、A のインターフェイスに従って有効です。特に、double がスローされることは想定していません。しかし、電話するかどうかを検討してください

foo(新B)

あなたが説明したインターフェースで、そして

B::f()
ダブルを投げることになった。

于 2010-03-05T15:16:43.073 に答える