C++で多重継承を使ってはいけない1つの理由

多重継承に限らないけど、仮想関数テーブル(へのポインタ変数)のせいで、キャストによってポインタのアドレスが変わることがある。
なのでガベージコレクタ(GC)を併用しているときに死ぬ。
GC は、new が返したアドレスが参照されているかどうか?で mark and sweep するのだけど、キャストでアドレスが変わってしまうと、どこからも参照されないと勘違いしてしまう。
つまり生きているポインタを sweep してしまう。
そして処理系はしばらく生き続け、あるとき突然死を迎える。


というのが今回の -O3 で処理系が死ぬ原因だった。
そもそも出来心で多重継承を使っていた僕が悪いのだけど、これは中々気づきづらいバグだよなあ。
細かくデバッグしてやっと気づいたけど、これは気づけたが自分を褒めてあげたい。
これをうまく防ぐ方法あるかな。(g++のオプションとか?)