30

このエントリから、仮想継承によってオブジェクトのメモリフットプリントにsizeof(pointer)が追加されることがわかります。それ以外に、デフォルトで仮想継承を使用し、必要な場合にのみ従来の継承を使用することには、何か欠点がありますか?将来性のあるクラス設計につながるようですが、落とし穴がないかもしれません。

4

2 に答える 2

25

欠点は

  1. すべてのクラスは、常にすべての仮想ベースを初期化する必要があります(たとえば、AがBの仮想ベースであり、CがBから派生している場合は、A自体も初期化する必要があります)。
  2. dynamic_cast使用するすべての場所でより高価なものを使用するstatic_cast必要があります(システムや設計で必要かどうかによって、問題になる場合とそうでない場合があります)。

ポイント1だけでは、仮想ベースを非表示にできないため、価値がありません。ほとんどの場合、より良い方法があります。

于 2010-12-28T04:02:05.937 に答える
16

私の経験では、(仮想メソッドではなく)仮想継承はほとんど必要ありません。C ++では、「菱形継承問題」に対処するために使用されます。これを回避すると、多重継承は実際には発生しません。

私が書いたコードと私が維持している数百万以上の回線システムの両方を含む、C++の本の外で仮想継承に遭遇したことはないと確信しています。

于 2010-12-28T03:53:08.853 に答える