私はStroustrup氏による「デザインと進化のC++」に次のコードを見つけました:複数の仮想(ダイヤモンド)継承
class W
{
public:
virtual void f();
virtual void g();
};
class AW : public virtual W
{
public:
void g() {}
};
class BW : public virtual W
{
public:
void f() {}
};
class CW: public AW, public BW ***, public virtual W***
{
};
CW* pcw = new CW;
AW* paw = pcw;
BW* pbw = pcw;
void fff()
{
pcw->f(); //invokes BW:f()
pcw->g(); //invokes AW:g()
paw->f(); //invokes BW:f() !
pbw->g(); //invokes AW:g() !
}
それはすなわちミックスインの動作を例示しています。共通の基盤に振る舞いを加え、 "お互いを知っている"異なるクラス。
なぜCWが直接Wから(、パブリック仮想W)を継承していますか? 私はVC2015の有無にかかわらず試しましたが、同じクラスレイアウトを生成します。
「W」のインスタンスを1つだけ継承するようにしますか? – Charles
@Charles私はAWのWからの仮想継承を考えており、BWはこれを担当しています。 – Mart