BとCの両方に純粋仮想関数もあります(->抽象クラスは継承された純粋仮想を実装する必要がありますか?)
はい 、継承されたすべての純粋仮想関数を実装するD 必要があります。
クラスがクラスのすべての純粋仮想関数を実装しない限り、クラス自体から派生し、抽象クラスとして機能します。
それらの1つ(B XOR C)のみが純粋仮想関数を持っています(->もう1つはまだf()を実装する必要がありますか?)
D任意の階層のBaseクラスを介して継承する純粋仮想関数を実装する必要があります。その直接のBaseクラスが純粋仮想関数を定義していない場合、そのクラスも抽象クラスになりD、継承された純粋仮想関数を実装しない限り、抽象クラスにもなります。
BもCも、独自の純粋な仮想を持っていません(-> BとCの実装をスキップして、Dに「パススルー」する方法はありますか?)
DA->B&を介して継承する純粋仮想関数を実装する必要があります。A-Cこの場合、とは両方ともB抽象Cクラスになることに注意してください。
上記の3つのケースのうち、Dがf()を実装する必要があるのはどれですか?Dがf()を実装するのはオプションですか?その場合、もしあれば、Dがf()を実装することはできませんか?
Dfoo()インスタンス化可能(非抽象)にできるようにするには、上記の3つの条件すべてで実装する必要があります。
結論:
- クラスは、基本クラスのすべてから継承するすべての純粋仮想関数を実装する必要があります。実装しないと、クラスは抽象クラスになります。
- 仮想属性は継承されます。スーパークラスが関数virtualを宣言する場合、派生クラスのオーバーライドされた関数も仮想であり、それから派生するすべてのクラスに仮想属性を渡します。
死のダイヤモンドを避けてください!あなたがそれに伴う微妙さを本当に理解していない限り。多くの人は、仮想継承を使用しようとしますが、それが実際には設計で達成したいことを達成するための最も適切な方法ではありません。一部のシナリオでは、仮想継承の使用が実際に必要ですが、それでも言語によって提供される重要な構成要素ですが、間違った方法で使用されることがよくあります。したがって、仮想継承が本当に必要かどうかを確認するために、一度設計を再検討することは理にかなっています。
以下は良い読み物かもしれません:
- 多重継承-パートI
- 多重継承-パートII
- 多重継承-パートIII