私はこのことについていくつかの考えを持っているが、それが正しいかどうかわからないここでスローされた例外タイプはBですが、catch(A a)
はB.派生クラスの例外が基本クラスのcatch句によってキャッチされる理由を示します。
をキャッチXcodeの
#include <iostream>
/*Exceptions*/
struct A {
A(int value) : m_value(value) {}
int m_value;
};
struct B : A {
B(int value) : A(value) {}
};
//+++++++++++++++++++++++++++++++
/*Exceptions End*/
int main(int argc, const char * argv[]) {
try {
try {
throw B(5);
}
catch (A a) {
a.m_value *= 2;
}
catch (B b) {
b.m_value -= 2;
throw b;
}
}
catch (A a) {
std::cout << a.m_value;
}
return 0;
}
に次のコードを試してみました。私はstruct A
のためにコピーコンストラクタを追加し、Aのコピーコンストラクタは、Bタイプのオブジェクトを一致させることができますconst A&
を受け付けてからだと思うし、暗黙的にこのことを確認するためにBからAへのデータ型を変換コンストラクタをコピーします。
A(const A& other) : m_value(other.m_value) {
std::cout << "hello\n";
}
このDO出力はハローcatch(A a)
を実行しながら、しかし、私はこのような明示的なコピーコンストラクタを定義する場合:
explicit A(const A& other) : m_value(other.m_value) {
std::cout << "hello\n";
}
は、コンパイラは、「『A』の初期化に該当するコンストラクタ」を叫んだん。
なぜわからないのですか?なぜちょうどcatch(B b)
にジャンプしませんでしたか?
非常に簡単!ありがとうございました! – Curtis2