基本クラスの関数の1つへのパラメーターとして、派生クラスのインスタンスを持つ基本クラスを持つことは可能ですか?例えば:
class A
{
virtual void foo(B b[]);
};
Class B: public A
{
void foo(B b[]);
};
これは合法ですか?また、クラスAにはクラスBのヘッダーファイルをインクルードする必要がありますが、これも問題がありますか?
基本クラスの関数の1つへのパラメーターとして、派生クラスのインスタンスを持つ基本クラスを持つことは可能ですか?例えば:
class A
{
virtual void foo(B b[]);
};
Class B: public A
{
void foo(B b[]);
};
これは合法ですか?また、クラスAにはクラスBのヘッダーファイルをインクルードする必要がありますが、これも問題がありますか?
前方宣言で可能です:
class B;
class A
{
virtual void foo(B b[]);
};
Class B: public A
{
void foo(B b[]);
};
しかし、それは主要なコードの匂いです。何を達成しようとしているのかを述べてください。これは設計に問題があるようです。
不思議なことに繰り返されるテンプレート パターンを使用できます。
template <class T>
class A
{
public:
virtual void foo(T t[]);
};
class B: public A<B>
{
public:
void foo(B b[]);
};
1 つの方法は、派生クラスで公開する機能を定義するインターフェイス クラスを定義することです。基本クラスのメンバー関数で派生クラス B の内部にアクセスする場合、このアプローチは既に投稿されたものよりも優れています。
class IntfB
{
public:
virtual void meth1() = 0;
virtual void meth2() = 0;
};
class A
{
public:
virtual void foo(IntfB b[]);
};
class B : public A, public IntfB
{
public:
virtual void meth1();
virtual void meth2();
};