掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
デストラクタを仮想関数にしたとき動き(2) (ID:68520)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
tetrapod さんありがとうございます。 確かにベースクラスのデストラクタを仮想関数として宣言しない場合の動作は「未定義」だと書かれています。 C++の標準規格では「未定義」だということはよくわかりました。よくぞこういう記述をご提示くださいました。 私が見た本やネットでの解説では、ベースクラスでコンストラクタを仮想関数として宣言する理由は 「サブクラスのデストラクタがコールされるようにする為」としか書かれていませんでした。 ですから貴重な収穫です。 ただ、 > ここは言語規格書が未定義としている誤ったコードとなる 「未定義」=「誤ったコード」ではなく、仕様が未定義なだけですから、実装に依存するということだと思います。 C++標準規格ではなく、MSの仕様としてどうなっているのかを確認する必要があるようですね。 特に今回はサブクラスで仮想関数としてl宣言した場合だけ落ちるわけですからね。 > Release モードだと誤りが検出されないのに対して > Debug モードだと親切にも誤りを検出してくれるので感謝しなきゃ これはコードの誤りを検出してるのではなく、メモリの不正アクセスを検出してるだけなので; ------------------------ 5.3.5 - Delete ... ... if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined. ... ... ...演算対象の静的な型がその動的な型と異なる場合、その静的な型は、演算対象の動的な型の根底クラスでなければならず、仮想デストラクタを持っていなければならない。そうでない場合の動作は未定義とする。...
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.