0

米国空軍のJSFC++コーディング標準では、仮想ベースにアクセスする派生クラスごとに仮想ベースクラスを宣言する必要があります。

たとえば、次の階層では次のようになります。

  A
 / \
B1  B2
C1  C2
 \ /
  D

...この標準で課す規則(参照用のAV規則88.1)では、クラスを次のように宣言する必要があります。

class A;
class B1 : virtual A;
class B2 : virtual A;
class C1 : B1, virtual A;
class C2 : B2, virtual A;
class D  : C1, C2, virtual A;

私の質問は次のとおりです。

  1. virtual Aこれは、宣言@ B1 / B2で仮想的に継承し、後続の各クラス宣言で指定しないこととは意味的に異なりますか?
  2. それが意味的に異なる場合、なぜ誰かがそれを省略したいのですか?潜在的な障害点が追加されるため、継承の各レイヤーでこれを絶対に実行する必要があることは、私にはばかげているように思われます。
4

1 に答える 1

1

各派生クラスはタイプの仮想ベースを1つAだけ持つため、意味的には同じです。ほとんどの派生クラスが仮想ベースを構築するため(非仮想ベースで発生する場合とは異なり)、仮想ベースに明示的に言及することは非常に便利です。派生クラスのコンストラクターを作成するときは、構築順序を覚えておくことが重要です。

(2)の技術的な答えはありません。あなたはそれをする必要はありません、しかしあなたがそうするならばそれは素晴らしいでしょう。あなたの両親を呼ぶように、私は推測します。多くのものと同様に、C++はあなたに合理的であることを強制しません。

于 2013-01-11T23:23:23.850 に答える