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 を前方宣言することはできませんし、基底クラスを含む前方宣言は全く意味をなしません。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] Pythonで関数を前方に宣言することは可能ですか?
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] 派生クラス関数から親クラス関数を呼び出すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較