1

次のコードがあります。

class Base
{
    public:
        virtual void doSomething() = 0;
};

class BaseImpl : public virtual Base
{
    public:
       virtual void doSomething() {
       // something
       }
};

class BaseDerived: public virtual Base
{
    public:
       virtual void doSomething2() = 0;
};

class BaseDerivedImpl: public BaseImpl, public BaseDerived
{
    public:
       virtual void doSomething2(){
       // sonething2
       }
};

で、〜がある

Base* b = new BaseImpl();
b->doSomething();          // fatal error at this line (not in the method, but in the method invocation)

問題は、関数に入っていないことです。

そのような階層を使用するのは何か問題がありますか?

4

1 に答える 1

2

OPはコメントを無視するので、ここで質問に答えさせてください:

そのような階層を使用するのは何か問題がありますか?

いいえ、何も問題はありません。これは、「恐ろしいダイヤモンド」の問題を解決する標準的な方法です (実際にはそれほど恐ろしいことではありません)。

ただし、この例ではダイヤモンドは機能しません。

Base* b = new BaseImpl();

BaseImplから直接派生するBaseため、標準の単一継承があります。コードは、まったく定義されていない場合BaseDerivedと同じように動作します。BaseDerivedImplそれらをコメントアウトしても、アプリは引き続きクラッシュします。

次に、このインスタンスを呼び出すdoSomethingとクラッシュします。の実装doSomethingは次のとおりです。

// something

したがって、私の結論は// somethingクラッシュが発生するということですが、そのメソッドの実装を見ずに判断することは不可能です。

于 2013-03-20T13:53:13.360 に答える