#include <iostream>
using namespace std;
class c1 {};
class c2 : public c1 {};
class c3 : public c1 {};
class c4 : public c2, public c3 {};
int main() {
c4 *x1 = new c4;
c3 *x2 = x1;
delete x2; // segmentation fault
}
こんにちは、私は型キャスティングと継承を理解しようとしています。私は最も派生したクラスへのポインタを持っていて、削除中に中間クラスに暗黙的に型キャストしました。私は最初の新しいクラスによって割り当てられたスペースを削除できるはずだと思っていました。いくつかのコンパイラでは、うまく見えますが、linux gccバージョン4.7.2(Debian 4.7.2-5)では、セグメンテーション違反が発生しています。理解できない、なぜ?どんなヘルプ/ポインタ/提案も感謝します。ポインタを削除するためのセグメンテーションフォールト
注 - クラスは、ダイヤモンド問題の形で導かれます。
c3に仮想デストラクタを実装する必要があります。 – Zefick
仮想の継承がないので、ダイアモンドの問題ではありません。クラスc4には、実際にはc1のインスタンスが2つあります。ありがとうございます。 – Zefick
私は仮想デストラクタの使い方についてもっと読んでいます。 –