1

クラス階層があり、その中に仮想関数を書いています。3つのクラスがあるとしましょう

 class A { virtual A* test(); }; ( File A.h )

 class B : public A { virtual C* test(); }; ( File B.h )

 class C : public A {}; ( File C.h )

のサブクラスであるというある種の前方宣言を行うことC.hで、 に含めることを避けることができますか?B.hCA

ありがとう、ゴクル。

4

3 に答える 3

1

クラスについて、3 つの異なる方法で、コンパイラに 3 つのことだけを伝えることができますC

  • それが存在すること。これを行うには、クラスを前方宣言します。
  • それがどのように構成されているか。これを行うには、クラスを宣言します。
  • それがどのように動作するか。これは、クラスのメンバー関数を定義することによって行います。

クラスの派生元をコンパイラに伝えたい場合は、クラスがどのように構造化されているかについて話していることになります。次に、コンパイラにクラスの宣言を表示する必要があります。他に方法はありません。

于 2010-05-01T11:16:03.110 に答える
1

C/C++ では、完全な型と不完全な型が区別されます。次のように前方宣言するclass Cと:

class C;

これは不完全な型として利用できます。つまり、それへのポインターを宣言できます。ただし、現時点では C は不完全な型であるため、C が完全に宣言されるまでサブクラス化することはできません。

を使用するclass C場所でインラインを使用できますC。あなたが望むものは:

class B : public A { virtual class C* test(); };
于 2010-05-01T07:50:01.163 に答える
0

B::test() が C* を返すように指定する理由はありません。C* は常に A* にダウンキャストされ、A へのインターフェイスを正しく使用しているクライアントは A* を期待するからです。B のクライアントが C* のみを期待する場合は、別の関数を呼び出すか、返された A* が dynamic_cast を使用して C* にアップキャストされるようにする必要があります。

クラス A の前にクラス C を前方宣言し、A::test() が C* を返すようにすることもまったく問題ありません。

于 2010-05-01T08:16:32.377 に答える