8

C++ の大きなコード ベースがあり、小さなリファクタリング (1 つのクラスが追加され、関連するメソッドがいくつか書き直された) の後、GCC 3 & 4 でリンカー エラーが発生し始めました。大規模な SDK のクラスをサブクラス化した小さなサンプル プログラム。

Web を検索しても、解決されたように見えるいくつかの古い GCC バグ以外の多くのヒントは得られませんでした。

問題の属性は次のようです。

  • GCC 3.4.6 & 4.3.3 の最適化-O2
  • 時折の仮想継承を含む多重継承。
  • たとえば、サンクが欠落しているクラスで継承順序を変更すると、問題が「修正」
    class Foo: public A, public B {} されます。
    class Foo: public B, public A {}

仮想継承は、参照カウントのために非常に一般的に使用される単一の基本クラスにのみ表示されます。私は、このクラスのすべての使用が実際に仮想パブリックであることを確認しました。偶然のパブリック継承ではありません。

明らかに、継承順序をいじっても問題は解決しません。他に何がありますか?

4

2 に答える 2

1

基本クラスの宣言順序を変更すると問題が解決する場合は、基本クラスの1つが宣言内容を適切に定義していないことを意味している可能性があります。

たとえば、クラスAに(仮想ではない)メソッドFuncがあり、クラスBにも同じ宣言があるが、クラスAに対してそれを定義したことがない場合、そのメソッドが子で初めて呼び出されたとき、クラスAのバージョンが呼び出されますが、リンク時に参照が見つかりません。継承順序を変更すると、コンパイラは代わりにB :: Funcを呼び出すようになります。これは定義されており、リンカはそれを検出します。

私見ですが、動作の予測とデバッグが難しいため、とにかく悪い設計です。

于 2012-10-29T11:42:48.790 に答える
0

ダイヤモンドの問題かもしれません

もしそうなら、このスレッドをチェックしてください

于 2012-10-16T13:27:37.853 に答える