0

一般的なダイヤモンドのシナリオでは:

class MBase {
  public:
    MBase(int) {}
    virtual char const* vf() const = 0;
    virtual ~MBase() {}
};

class D1 : public MBase { //NOT VIRTUAL!!!
  public:
    D1() : MBase(1) {}
    char const* vf() const { return "D1"; }
};

class D2 : virtual public MBase {
  public:
    D2() : MBase(2) {}
    char const* vf() const { return "D2"; }
};

class Bottom : public D1, public D2 {
  public:
    char const* vf() const { return "Bottom"; }
}

Bottomの継承修飾子をD1とD2の両方で仮想になるように変更した場合、何が変わりますか?つまり、それは何らかの影響を及ぼしますか?

class Bottom : public virtual D1, public virtual D2 {
  public:
    char const* vf() const { return "Bottom"; }
}
4

1 に答える 1

3

いいえ、そうではありません。各クラスは、直接の基本クラスのどれを他のクラスと共有できるかを選択します。Bottomは実装のリーフであり、どちらの場合もとのインスタンスが1つしかないD1ため、D2どちらの場合も、これらのタイプのネストされたオブジェクトが1つだけあります。D1を共有することを拒否するため、MBase2BottomつのMBaseオブジェクトもネストされます。

ただし、あいまいなため、両方のバージョンから直接MBaseアクセスすることはできません。オブジェクトに明示的にキャストするか、オブジェクトを介してアクセスする必要があります(正確には、2つあるため)。BottomD1D2MBaseBottomMBase


違いはD1、仮想的に継承するものMBaseと継承しないものがある場合です。

于 2012-04-14T20:14:42.197 に答える