問題タブ [pure-virtual]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 「純粋仮想関数呼び出し」のクラッシュはどこから発生しますか?
「純粋な仮想関数呼び出し」というエラーでコンピューターがクラッシュするプログラムに気付くことがあります。
抽象クラスからオブジェクトを作成できない場合、これらのプログラムはどのようにコンパイルされるのでしょうか?
c++ - 具象クラスから抽象クラスを派生させる
具体的な があるとしましょうclass Apple。class Peach(Apple オブジェクトはインスタンス化できます。) さて、誰かがやって来て、Apple から抽象を導き出します。新しい純粋仮想関数を導入するため、抽象的です。Peach のユーザーは、Peach から派生させて、この新しい関数を定義することを余儀なくされています。これはよくあるパターンですか?これは正しいですか?
サンプル:
ここで、具体的な があるとしましょうclass Berry。class Tomato誰かがベリーから要約を導き出します。これは、Berry の仮想関数の 1 つを上書きして純粋な仮想関数にするため、抽象的です。Tomato のユーザーは、Berry で以前に定義された関数を再実装する必要があります。これはよくあるパターンですか?これは正しいですか?
サンプル:
注: 名前は考案されたものであり、実際のコードを反映していません (うまくいけば)。この質問の執筆において、果物は害を受けていません。c++ - C++ でインターフェイスを宣言するにはどうすればよいですか?
インターフェイスを表すクラスをセットアップするにはどうすればよいですか? これは単なる抽象基本クラスですか?
c++ - C++ では、純粋仮想関数を定義することは可能ですか?
これが取引です。私は大きなクラス階層を持っており、この 1 つのメソッドをずっと拡張しています。メソッドは常に、新しいレベルごとに 1 つまたは 2 つの変数を調べる必要があり、これらの変数は階層内の実際のクラスに依存します。私がやりたいことは、これら 2 つの余分な変数をチェックしてから、同じ関数のスーパークラスのバージョンを呼び出すことです。直接の子がすべて使用するので、この関数を定義できるようにしたいのですが、そのクラスのすべての子がそのメソッドを再定義する必要があるようにしたいです (新しいデータメンバーを確認する必要があるため)。
では、これをどのように書けばよいでしょうか。私は通常 =0; を使用します。.hファイルに含まれていますが、それを使用して定義することはできないと思います...
c++ - (通常の) 仮想メソッドを純粋な仮想メソッドでオーバーライドすると、どのような影響がありますか?
私たちが持っているとしましょう
これは本当にオーバーライドですか?これは実際にはオーバーロードしていると思います。このようなものをデザイン的に作る意味は何ですか?
基本クラス A を取得しました。次に、具象クラス A から派生した抽象派生クラス B を取得し、C を介して B を実現しました。
私たちはここで何をしていて、意味がありますか?
c++ - C++ の純粋仮想デストラクタ
次のように書くのは間違っていますか?
抽象基本クラスの?
少なくともそれは MSVC でコンパイルされます...実行時にクラッシュしますか?
c++ - 純粋仮想クラスの DECLSPEC_NOVTABLE?
これはおそらく習慣的なプログラミングの冗長性です。ヘッダーで定義された一連のインターフェースで DECLSPEC_NOVTABLE ( __declspec(novtable) ) に気付きました:
この__declspec 拡張属性に関するMSDN の記事では、この男を追加するとコンストラクトとデストラクターの vtable エントリが削除されるため、「コード サイズが大幅に削減される」と記載されています (vtable が完全に削除されるため)。
これは私にはあまり意味がありません。これらの人は純粋な仮想です。コンパイラがデフォルトでこれを行わないのはなぜですか?
この記事では、これを実行してから、これらのいずれかをインスタンス化しようとすると、実行時アクセス違反が発生することも述べています。しかし、いくつかのコンパイラ (__declspec 拡張機能の有無にかかわらず) でこれを試したところ、(予想どおり) コンパイルされませんでした。
だから私は要約すると思います:
- 純粋な仮想インターフェイスに関係なく、コンパイラは vtable を取り除きますか、それともここで何か基本的なことを見逃していますか?
- MSDNの記事は何について話しているのですか?
c++ - 純粋仮想関数呼び出し
私は明らかにC++を「理解」していません。
このプログラミングの割り当てで、私は行き止まりにぶつかりました。次のコード行で実行時エラーが発生します。
「実行時エラー - 純粋仮想関数呼び出し」というメッセージが表示されます。
私の理解では、子クラスが現在インスタンス化されていないときに関数参照が (仮想) 基本クラスを呼び出そうとすると、このエラーが発生します。しかし、どこでこの間違いを犯したのかわかりません。
関連コード:
教授のコード:
私のコード:
The Old New Thing: What is __purecall? を読みました。Visual C++ の R6025 実行時エラーの説明ですが、上記のコードでこれが発生する理由が完全にはわかりません。
[編集] main.c の完全なリスト (はい、すべて 1 つのファイル...割り当て要件の一部です。)
c++ - ポインターのベクトルを作成することは可能ですか?
私が遭遇している問題のために、ポインターのベクトルを作成することは可能ですか?もしそうなら、どのように?特にイテレータと.begin()の使用に関しては、次のようになります。このベクトルをポインタのベクトルに変換するにはどうすればよいですか。
c++ - __cxa_pure_virtual の目的は何ですか?
avr-gcc でコンパイル中に、次のようなリンカ エラーが発生しました。
次のようなドキュメントを見つけました。
この
__cxa_pure_virtual関数は、純粋仮想関数が呼び出されたときに呼び出されるエラー ハンドラーです。純粋仮想関数を持つ C++ アプリケーションを作成している場合は、独自の
__cxa_pure_virtualエラー ハンドラー関数を指定する必要があります。例えば:
extern "C" void __cxa_pure_virtual() { while (1); }
この関数を提案どおりに定義するとエラーが修正されますが、知りたいのですが:
- この機能の目的は何か、
- なぜ自分で定義する必要があるのか
- 無限ループとしてコーディングすることが許容されるのはなぜですか?