2

私は次のものを持っています:

class Abstract
{
    virtual void AbstractMethod() = 0;
};

class Implementer
{
    void AbstractMethod() {};
};

class Concrete : public Abstract, private Implementer
{};

Concrete純粋仮想メソッドAbstractMethodがオーバーライドされていないため、インスタンス化できません。私は何を間違っていますか?

4

1 に答える 1

6

ここでは多重継承を使用しています。

コンクリートには、別々に扱われる 2 つの階層があります。

アブストラクトとインプリメンター。Abstract は Implementer とは関係がないため、その場合 (兄弟継承のため) に virtual を使用すると失敗します。

派生クラスで仮想関数をオーバーライドする必要があります。あなたが試みている方法でそれを行うことはできません。

具体的には、次のように書き直すとうまくいきます。

class Abstract
{
    virtual void AbstractMethod() = 0;
};

class Implementer : private Abstract
{
    void AbstractMethod() {};
};

class Concrete : public Implementer
{};

Concrete でパブリックまたはプライベートの継承を使用しても、問題には影響しないことを指摘したいと思います。元の例で Implementer を public に変更しても、具象クラスにはなりません。

有用な補助情報:可能であれば多重継承を避け、継承よりも構成を優先し、深い継承よりも浅い継承を優先します。http://en.wikipedia.org/wiki/Composition_over_inheritance

多重継承のルートをたどっている場合は、C++ ではデフォルトで個別の継承階層があり、異なるパスを結合するために仮想継承が必要であることに注意してください (仮想メソッドには、それらをオーバーライドするための派生クラスが必要ですが、兄弟クラスではありません)。http://en.wikipedia.org/wiki/Multiple_inheritance

于 2014-06-30T22:03:25.540 に答える