2009-06-18 16 views
2

私は長い間、これを行うためのきれいな方法を模索しています。私の問題では、共通の親を共有していないが、それぞれが同じ名前のいくつかのメソッド(A.doSomething、B.doSomething、C.doSomething)を持つ3つのクラスが存在します。したがって、同じ関数シグネチャを持つクラスDは、Aから継承し、メソッドdoSomething()を使用すると、BまたはCを継承するEに「同じに見える」ことになります。この問題で複数の継承階層

class Base { 
    public: 
    void myMethod(void) { doSomething(); } 
}; 

class Independent { 
    public: 
     doSomething(); 
}; 

clase Derived : public Base : public Independent { 
(...) 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 

、タイプ「独立」のオブジェクト私は変更することはできませんライブラリで提供されています。ここでは

は私が行うことができるようにしたいのですが何のスケッチです。後で継承されるメソッドを使用する基本クラスを定義したいと思います。あいまいなコンパイルをせずに仮想継承を使用してこれを行う適切な方法を見つけることができませんでした。

+0

問題をもう少し詳しく説明できますか?そのコードスニペットには「doSomething」というメソッドが1つしかありませんが、説明に3つのクラスがあり、「myMethod」メソッドの対象となるものについてはコメントしません。 –

答えて

5

厄介な状況があります。これに対する一つの解決策は、このように、コンパイル時に継承を行うために不思議な定期的なテンプレートパターンを使用することになります。

template <typename D> 
class Base { 
    public: 
     void myMethod(void) { static_cast<D*>(this)->doSomething(); } 
}; 

class Independent { 
    public: 
     void doSomething(); 
}; 

clase Derived : public Base : public Independent { 
    /*...*/ 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 

を別の方法として、あなたは(私は仮定Independentに転送する間に仲介クラスを置くことを選択することができます同じBaseIndependentから派生した多くのクラスがあり、クラスごとにこれを行う必要はありません。

template <typename D> 
class Base { 
    private: 
     virtual void doSomethingImpl(); 
    public: 
     void myMethod(void) { doSomethingImpl(); } 
}; 

class Independent { 
    public: 
     void doSomething(); 
}; 

class IndependentWrapper : public Base : public Independent { 
    private: 
     void doSomethingImpl() { Independent::doSomething(); } 
}; 

clase Derived : public IndependentWrapper { 
    /*...*/ 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 
関連する問題