が、私はこのことについて質問がありますか?私はをA
オブジェクトの代わりにB
のコンストラクタに渡します。 int
はB
のコンストラクタでA
に変換されていますが、その理由は何ですか?C++の継承の質問
ありがとうございます。
Avri。
が、私はこのことについて質問がありますか?私はをA
オブジェクトの代わりにB
のコンストラクタに渡します。 int
はB
のコンストラクタでA
に変換されていますが、その理由は何ですか?C++の継承の質問
ありがとうございます。
Avri。
explicit
コンパイラはi
を使用してA
のanomymousインスタンスを作成し、B
インスタンスを初期化するためにそれを使用しているとして、あなたはA
コンストラクタを宣言していないので。コンパイラがこれらの暗黙的な変換を実行しないようにするには、costructorをexplicit
と宣言します。その後、コンパイラエラーが発生します。 int
からA
への変換がありますのでA
がint
を取り、explicit
はあなたが暗黙的にint
変換することができますマークされていない単一のパラメータのコンストラクタを持っているので
、暗黙のうちにあなたのコードは
A* p = new B(A(i));
に翻訳されますA
に
B
のための唯一の現実的なコンストラクタはA
かかりますので、あなたは、new B(i)
を行うと、試行がA
にi
を変換し、そこから新しいB
を構築するために作られています。この変換は、を取るコンストラクタを使用して一時的にA
を作成することによって行われます。 B
オブジェクトが構築されると
、基底クラスA
、一時A
からメンバ変数a
とpa
のコピーを意味する一時A
から構築コピーです。
厳密には、コンストラクタがA
オブジェクトを値で受け取るため、一時的に概念的には再びコピーされます。ただし、コンパイラはB
のコンストラクタパラメータをi
から直接作成することで一時的な効果をなくすことができますので、効果は単なるコピーのように見えます。一時的A
が破壊されたときに、delete pa
が動的に割り当てられたint
が破壊されることになりますが、新しく割り当てられたB
オブジェクトの基底クラスAは今も無いこのポインタのコピーを持っていますので
これは重大なエラーが発生します無効なオブジェクトの長点。コンパイラがコピーの1つを削除しない場合、すぐに「ダブルフリー」が発生します。
A
の主な特徴は、リソースアクション(割り当て解除)を実行するユーザー定義のデストラクタがあることです。これは、A
は、コンパイラ生成バージョンがA
の設計と一貫して機能しない可能性があるため、ユーザー定義のコピーコンストラクタとコピー代入演算子が必要であるという強い警告です。
これは、デストラクタ、コピーコンストラクタ、またはコピー代入演算子のいずれかのユーザ定義バージョンが必要な場合、すべてのユーザ定義バージョンが必要になる可能性があるという3つのルールです。それら。
例では、動的に割り当てられたB
オブジェクトを解放しようとしましたが、「ダブルフリー」エラーが発生する可能性があります。また、A
のデストラクタは、A
へのポインタを正しく削除するために、virtual
とマークする必要があります。
great tnxなので、例えばintの代わりにchar *のような他の型を追加すると、Aは上記の型を扱うのに適切なc'torを持たないため、コンパイルされません。 – Avri