このエントリから、仮想継承によってオブジェクトのメモリフットプリントにsizeof(pointer)が追加されることがわかります。それ以外に、デフォルトで仮想継承を使用し、必要な場合にのみ従来の継承を使用することには、何か欠点がありますか?将来性のあるクラス設計につながるようですが、落とし穴がないかもしれません。
6858 次
2 に答える
25
欠点は
- すべてのクラスは、常にすべての仮想ベースを初期化する必要があります(たとえば、AがBの仮想ベースであり、CがBから派生している場合は、A自体も初期化する必要があります)。
dynamic_cast
使用するすべての場所でより高価なものを使用するstatic_cast
必要があります(システムや設計で必要かどうかによって、問題になる場合とそうでない場合があります)。
ポイント1だけでは、仮想ベースを非表示にできないため、価値がありません。ほとんどの場合、より良い方法があります。
于 2010-12-28T04:02:05.937 に答える
16
私の経験では、(仮想メソッドではなく)仮想継承はほとんど必要ありません。C ++では、「菱形継承問題」に対処するために使用されます。これを回避すると、多重継承は実際には発生しません。
私が書いたコードと私が維持している数百万以上の回線システムの両方を含む、C++の本の外で仮想継承に遭遇したことはないと確信しています。
于 2010-12-28T03:53:08.853 に答える