問題タブ [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++ では、純粋仮想関数の実装を与えることは正当です。
なぜあなたはこれをしたいのですか?
関連する質問: C++ faq liteには例が含まれています:
デストラクタが純粋仮想として宣言されてから実装される理由がわかりません。なぜこれが速くなるべきなのかというコメントがわかりません。
c++ - C ++での純粋仮想関数の用途は何ですか?
私は今、クラスでC ++について学んでいますが、純粋仮想関数についてはあまり理解していません。後で派生クラスで概説されることを理解していますが、派生クラスで定義するだけの場合、なぜ0に等しいと宣言したいのでしょうか。
c++ - C ++で純粋な仮想デストラクタが必要なのはなぜですか?
仮想デストラクタの必要性を理解しています。しかし、なぜ純粋な仮想デストラクタが必要なのですか?C ++の記事の1つで、クラスを抽象化する場合は、純粋な仮想デストラクタを使用すると著者は述べています。
ただし、メンバー関数のいずれかを純粋な仮想として作成することにより、クラスを抽象化できます。
だから私の質問は
デストラクタを本当に仮想にするのはいつですか?誰かが良いリアルタイムの例をあげることができますか?
抽象クラスを作成するとき、デストラクタも純粋な仮想にするのは良い習慣ですか?はいの場合..それではなぜですか?
c++ - 純粋な仮想クラスを実装するインスタンスのC++コレクション
私はクロスプラットフォームC++で作業しており、いくつかのクラスを次のように定義しています:(この例では大幅に簡略化されています)
元々、私は単一のクラスしか持っていませんでした。それは、std :: vectorにインスタンスの束を格納し、const参照によって渡されました。しかし今、私は基本クラス(純粋な仮想を維持したい)といくつかのポリモーフィック実装クラスを持っている必要があります。
実装インスタンスのコレクションを持ちながら、スタックにstd :: vectorを割り当てるなど、リークのない簡単なメモリ管理を行うための最良の方法は何ですか?
std :: vectorはクラスが非純粋な仮想である必要があるため(内部割り当て/コピーなどを行うため)、明らかにstd ::vector<ExampleBase>を使用することはできません。コードのユーザーが誤ってExampleBaseのインスタンスを作成してほしくないのは、それが間違っているからです。また、オブジェクトのスライスやその他の厄介な問題の可能性を回避したいと思います。
一連の
std::auto_ptr作業で十分ですが、すべてを初期化して、「空きスロット」を探し、イテレータなどを探す必要があります。このホイールの再発明をすべて行うのは少しおかしいようです。boost::ptr_vector有望に見えましたが、Linuxでビルドする場合、ExampleBaseが非純粋な仮想である必要があるという点で、少し奇妙な動作をします。理由はわかりませんboost::ptr_vector。
これは単純なようで、おそらく本当に一般的な状況です。では、これを行うための最良の方法は何ですか?私はこれを行う他の標準またはブーストの方法を受け入れています:「最良」の方。
c++ - シンボル「vtable for ...」および「typeinfo for ...」は未定義ですか?
ほぼ最終ステップですが、まだ奇妙なエラーがいくつかあります....
vtable と typeinfo の意味は何ですか?
c++ - と呼ばれる純粋仮想メソッド
コンストラクタから仮想関数を呼び出すことがなぜ悪いのかは理解していますが、デストラクタを定義すると「呼び出される純粋仮想メソッド」例外が発生する理由がわかりません。コードはconst値を使用して、動的割り当ての使用を減らします。おそらく原因もそうです。
c++ - 実装された純粋仮想関数
私の基本的な理解は、純粋仮想関数の実装はないということですが、純粋仮想関数の実装があるかもしれないと言われました。
上記のコードは大丈夫ですか?
実装を備えた純粋仮想関数にする目的は何ですか?
c++ - 純粋仮想関数が 0 で初期化されるのはなぜですか?
純粋仮想関数は常に次のように宣言します。
つまり、常に 0 が割り当てられます。
私が理解しているのは、これはこの関数の vtable エントリを NULL に初期化することであり、ここに他の値があるとコンパイル時エラーが発生するということです。この理解は正しいですか?
c++ - 呼び出される純粋仮想メソッド
編集:解決済み
私は現在、マルチスレッドプロジェクトに取り組んでおり、ベースワーカークラスがあり、そこから継承するさまざまなワーカークラスがあります。実行時に、ワーカークラスはスレッドになり、スレッドは必要に応じて作業を実行します。
これで、すべてのワーカーへのポインターの配列を維持することになっているディレクターが作成されました。これにより、ワーカーから情報を取得したり、後でワーカー内の変数を変更したりできます。
これを行うには、基本クラスのポインターへのポインターを作成します。
次に、Directorのコンストラクターで、ポインターの配列を基本ワーカークラスに動的に割り当てます。
各ワーカースレッドのコンストラクターで、ワーカーはディレクター内の関数を呼び出します。この関数は、そのワーカーのポインターを配列に格納することを目的としています。
ディレクターがポインターを格納する方法は次のとおりです。
ワーカーバリアントの例を次に示します。各ワーカーは基本ワーカークラスから継承し、基本ワーカークラスには、すべてのワーカーバリアントに存在する必要がある純粋仮想関数と、すべてのワーカー間で共有されるいくつかの変数が含まれます。
次に、baseWorkerClassは次のようになります。
各ワーカーバリアントの初期化が完了すると、baseWorkerClassオブジェクトへのポインターの配列ができあがります。これは、たとえば、次のように、IDを配列のインデックスとして使用して、特定のワーカーの特定の変数の値を取得できる必要があることを意味します。
問題は、このコードが理由の説明なしにWindows実行可能ファイルでクラッシュを引き起こすことであり、Linuxでは次のように述べています。
アクティブな例外なしで呼び出されたterminateと呼ばれる純粋仮想メソッドが
中止 されました
ある時点でこれが機能していると誓うことができたので、何を台無しにしたのか混乱しています。
問題のある実際の変更されていないコード:
ワーカーバリアントヘッダー: http: //pastebin.com/f4bb055c8
ワーカーバリアントソースファイル:http://pastebin.com/f25c9e9e3
ベースワーカークラスヘッダー: http: //pastebin.com/f2effac5
ベースワーカークラスソースファイル:http://pastebin.com/f3506095b
ディレクターヘッダー: http: //pastebin.com/f6ab1767a
ディレクターソースファイル:http://pastebin.com/f5f460aae
編集:追加情報、manageWorker関数では、ポインター「worker」から純粋仮想関数のいずれかを呼び出すことができ、それは問題なく機能します。manageWorker関数の外で、ポインター配列を使おうとすると失敗します。
編集:今考えてみると、スレッドのエントリポイントはoperator()です。Directorスレッドはワーカーの前に作成されます。これは、オーバーロードされた括弧演算子が、子クラスによってオーバーライドされる前に純粋仮想関数を呼び出していることを意味する場合があります。私はこれを調べています。
c++ - 抽象クラスからのクラスの派生(C ++)
純粋仮想関数f()を持つ抽象クラスがあり、そのクラスから継承されたクラスを作成し、関数f()をオーバーライドしたいと思います。ヘッダーファイルとcppファイルを分離しました。ヘッダーファイルで関数f(int)を宣言し、定義はcppファイルにあります。ただし、コンパイラは、派生クラスはまだ抽象的であると言います。どうすれば修正できますか?