1. ホーム
  2. c++

C++で、あるクラスを他のクラスから継承すると前向きに宣言することは可能ですか?

2023-09-03 11:46:48

質問

できることは知っています。

class Foo;

のように、あるクラスを他のクラスから継承していると前倒しで宣言することができます。

class Bar {};

class Foo: public Bar;


使用例としては、co-variant reference return typesが挙げられます。

// somewhere.h
class RA {}
class RB : public RA {}

... そして、somewhere.hを含まない別のヘッダで

// other.h
class RA;

class A {
 public:
  virtual RA* Foo();  // this only needs the forward deceleration
}

class RB : public RA; // invalid but...

class B {
 public:
  virtual RB* Foo();  // 
}

コンパイラの唯一の情報である の宣言を処理するために必要な情報は RB* B:Foo() は、その RB があります。 RA をパブリックな基底クラスとして持っています。からの戻り値を何らかの形で参照するのであれば、 明らかに somewhere.h が必要でしょう。 Foo . しかし、もしあるクライアントが決して Foo を呼び出さないのであれば、コンパイルを大幅に高速化できる somewhere.h をインクルードする理由はないでしょう。

どのように解決するのですか?

前方宣言は、その名前のクラスが存在し、他の場所で宣言・定義されることをコンパイラに伝えるためにのみ、本当に有用です。 コンパイラがクラスに関する文脈情報を必要とするような場合には使用できませんし、クラスについてほんの少ししか知らせないこともコンパイラにとって何の役にも立ちません。 (一般的には、パラメータや戻り値など、他のコンテキストなしにそのクラスを参照する場合にのみ、前方宣言を使用することができます)。

したがって、Bar を Foo の宣言に使用するようなシナリオで Bar を前方宣言することはできませんし、基底クラスを含む前方宣言は全く意味をなしません。