2016-07-09 5 views
0

例えば、私は抽象基底クラスABを持っています。クラスA12つの折り畳まれた多型は奇妙です、どのようにそれを拡張可能にするのですか?

class A1 : public A 
{ 
public: 
    void f(B& b) override { b.f(A1); } 
}; 

について

class A 
{ 
public: 
    virutal void f(B& b) = 0; 
}; 

に追随し、これBのために、それは仮想メソッドf(A1)

class B 
{ 
public: 
    virtual void f(A1& a) = 0; 
}; 

そしてclass B1 : public B中を必要とする、仮想メソッドがあるようAは、仮想メソッドを持っています実装されました。問題は、別のclass A2 : public Aが追加されたときに、Bの仮想メソッドvirtual void f(A2& a) = 0を追加する必要があります。Bをデザインすると、A2でもA1が追加されたかどうかわからないため、コードが壊れてしまうと思います。どのようにそれを避けるが、同等の要件を実装する?どのC++機能もテンプレートでも使用できます。

+0

本当に達成したいことはありますか? –

答えて

1

残念ながら、C++での仮想テンプレート関数はありません(これは、あなたの質問を解析した後に達成しようとしていると思います)。

最も近い、と私は考えることができる最も醜いソリューションは、Bをパラメータとして、基本クラスAを取る基本クラスで仮想関数を持つことです:それ、その後、用途

class B 
{ 
public: 
    virtual void f(A& a) = 0; 
}; 

B1オーバーライドdynamic_castを使用して、そのパラメータをA1のインスタンスにキャストします。

このように、基本クラスのAPIインターフェイスを2つの階層間で変更することなく、各AxBxの派生クラスのペアを定義し続けることができます。

醜いですが、質問には「任意のC++機能を使用できます」と記載されており、dynamic_castは確かにその要件の対象となります。

関連する問題