2017-02-07 11 views
1

で例外処理Iは、(//でタグ付けされた行に注意 - )私はトラブルの理解を持っていた符号化問題全体を実行しました:クラスとC++

#include <iostream> 

using namespace std; 

class X { }; 

class X0 { }; 
class X1: public X0 { }; 
class X2: public X1 { }; 

void f(int i) { 
    if (i == 0) { 
     throw X0(); 
    } else if (i == 1) { 
     throw X1(); 
    } else if (i == 2) { 
     throw X2(); 
    } else { 
     throw X(); 
    } 
} 

int main(int argc, char* argv[]) { 
    try { 
     f(0);      //- 
    } catch (X1) { 
     cout << "A" << endl; 
    } catch (X2) { 
     cout << "B" << endl; 
    } catch (X0) { 
     cout << "C" << endl; 
    } catch (...) { 
     cout << "D" << endl; 
    } 
} 

このコードの出力はCであるが、予想通り。タグ付き行を "f(1);"に変更すると出力も期待どおりのAです。

ただし、タグ付きの行を「f(2);」に変更すると、答えはでも Aです。私はその理由を理解していません。デストラクタの範囲と関係があるかもしれないと思うが、何を勉強すればよいか分からないので、情報を見つけようとする試みは成功していない。誰でもここで起こっていることを説明することができますか、またはこの問題が示している概念の名前だけで、私はそれを研究することができますか?どんな助けもありがとうございます。それは同様X1キャッチX2ため、X1からそうでない場合は、キャッチを得られるよう

+1

X2もX1であり、X1のキャッチが最初であるためトリガーになります。 – Vality

+1

デストラクタとは?ここにデストラクタはありません。 – EJP

+0

「デストラクタの範囲」とはどういう意味ですか? – EJP

答えて

3

最初の最も特定をキャッチするためにあなたのキャッチを並べ替える必要がある、と私たちの前にトリガがX2 1に達するようX1ためのcatchブロックが最初です。

+0

ああ、わかりましたので、これは継承のデモンストレーションですか? – Mock

+0

@Mockまさしく、これは私が常に継承が(一般的に)「is」関係であると言う理由です。ほとんどの場合、BがAの子であれば、コードはBが「ある」のように振る舞い、Aが必要な場合にはAとして扱われます。 – Vality

+0

それは理にかなっています。私は継承を学んだので、それは非常に長い時間でした。皆さん、助けていただきありがとうございます。私は可能な限りこれを承認します。 – Mock

1

あなたは、X1X2をキャッチする必要があります。

Javaでは、これはコンパイルエラーでした。

3

i == 2のときはX2を投げ、X2はX1から派生します。

キャッチの順序は重要です。まずX1をキャッチしようとします.X2(投げたもの)がX1であるため、キャッチが発生します。あなたはX2X1から継承し、そうX1「である」

2

ただし、タグ付きの行を「f(2);」に変更すると、答えはまたAです、なぜ私は理解していません。

X2X1のサブクラスであるためです。

f(2)tryに電話すると、f(2)X2となります。例外は、catch(X2)に捕らえられるべきだと思われます。しかし、X2はサブクラスX1です。

だから、例外がcatch(X1)に巻き込まれ、あなたがf(2)を呼び出すときにBを見たい場合はcatchプリントA.

内のコードはので、コードは次のようにする必要があります。

//skipped some code 

int main(int argc, char* argv[]) { 
    try { 
     f(2);      //- 
    } catch (X2) { 
     cout << "B" << endl; 
    } catch (X1) { 
     cout << "A" << endl; 
    } catch (X0) { 
     cout << "C" << endl; 
    } catch (...) { 
     cout << "D" << endl; 
    } 
} 
関連する問題