問題タブ [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.

0 投票する
4 に答える
10983 参照

c++ - 「インターフェイス内に仮想デストラクタ」を配置しても、定義上、インターフェイスではなくなりませんか?

これが私が入っているボックスです。「インターフェイスクラス内に仮想デストラクタを配置する」ことが重要である理由を理解したいと思います。最後までがんばれば、引用符で囲まれている理由がわかります... また、すべての語彙を完全に正しいものにしたいと考えています。これまでのプロセスで私がいる場所は次のとおりです。

  1. 基本クラスがある場合もあれば、基本クラスから継承する派生クラスがある場合もあります。

  2. 派生オブジェクトを指しているベースポインターがあり、さらに派生オブジェクトを指すそのベースポインターから行われたメンバー関数呼び出しを、実際に呼び出されたかのように動作させたい場合派生オブジェクトから、呼び出すメンバー関数は、基本クラスで仮想として宣言する方がよいでしょう。

  3. インターフェイスは、純粋仮想関数のみを持つ任意のクラスです。このインターフェイス クラスから新しいクラスを派生させ、すべての純粋仮想関数を実装すると、最終的に派生クラスのインスタンスを作成できます。

  4. インターフェイス クラスのインスタンスを持つことはできませんが、インターフェイス クラスへのポインターのインスタンスを持つことはできます。

  5. 派生クラスのオブジェクトを実際に指すインターフェイス クラスへのポインターがある場合 (実際には、#4 が正しい場合は常にそうする必要があると思います)、およびそのオブジェクトを削除することにした場合あなたのポインタ、そして「インターフェースクラス内に仮想デストラクタ」がない場合、派生オブジェクトを破壊する意図は、ベースオブジェクト(つまりインターフェースクラス)を破壊するための呼び出しとしてのみ実行されます。仮想デストラクタでは、派生オブジェクトのデストラクタが実際に呼び出されるポイントに到達することはなく、メモリ リークが発生します。

ふぅ。わかりました、それが正しければ、私の質問に移ります。次のように、インターフェイス内で仮想デストラクタを宣言するだけで十分ですか。

それは私には間違っているように見えます...だから、次のようにデストラクタを純粋仮想にするとどうなりますか:

それらは単なる宣言であるため、これらのいずれかが「インターフェイス クラス内の仮想デストラクタ」としてカウントされますか? 宣言されているが定義されていないデストラクタを使用できますか? それが純粋な仮想である場合にのみ、私は推測します...

とにかく、タイトルの質問に戻ります...私は本当にできる限り速く進んでいます...これがお金のショットです...「インターフェースクラス内の仮想デストラクタ」が少なくともこのような空の定義を必要とする場合:

次に、そのメンバー関数は純粋仮想ではありません (定義を指定したため、そうではありません)。したがって、クラスはインターフェイスではなくなります (純粋仮想メンバー関数だけが含まれているわけではありません)。

これは、インターフェイスの仮想デストラクタを定義すると、インターフェイスがなくなることを意味します (ただし、いくつかの抽象基本クラスのみ)。これはただの言葉遣いですか?何が起こっているのか理解できますか?

注: これはすべて、「インターフェースとは何か?」という自問自答から生まれました。次に、この質問の回答を読んでください: C++ でインターフェイスを宣言するにはどうすればよいですか?

短すぎるライドでは長すぎないことを願っていますが、これらの概念とそれに関連する語彙を完全に理解することを決意しています.

0 投票する
6 に答える
362 参照

c++ - 純粋仮想メソッドを持つ抽象クラス - 「Abstract * abs3;」を実行できるのはなぜですか?

次のことを考慮してください。

を実装していないことに注意してくださいfunc()。では、なぜAbstract * abs3; 純粋仮想メソッドと抽象クラスがあるところで実行できるのでしょうか? abs3->func(); を実行しようとすると実行時エラーが発生することはわかっています。、しかし、それでも、なぜ C++ がそのコードのコンパイルを許可するのか、私には明らかではありません ...?

ありがとう、ロン

0 投票する
2 に答える
113938 参照

c++ - 「抽象型のオブジェクトを割り当てられません」エラー

エラーはここにあります:

祖父母クラス:

親クラス:

実際/子クラス:

ここにコード全体を書くことはできません…</p>

0 投票する
4 に答える
600 参照

c++ - C ++、ダイヤモンドの継承、純粋な仮想をどこに/いつ実装する必要がありますか?

C ++:純粋仮想関数f()を持つ基本クラスAがあり、2つのクラスBとCが仮想的にAから継承し、クラスDがBとCの両方から継承します(典型的なダイアモンド構造):

次の場合、どこでいつf()= 0を実装する必要がありますか?

  1. BとCの両方に純粋仮想関数もあります(->抽象クラスは継承された純粋仮想を実装する必要がありますか?)
  2. それらの1つ(B XOR C)のみが純粋仮想関数を持っています(->もう1つはまだf()を実装する必要がありますか?)
  3. BもCも、独自の純粋な仮想を持っていません(-> BとCの実装をスキップして、Dに「パススルー」する方法はありますか?)
  4. 上記の3つのケースのうち、Dがf()を実装する必要があるのはどれですか?Dがオプションでf()を実装するのはどの場合ですか?その場合、もしあれば、Dがf()を実装することはできませんか?

この種の問題について他に一般的な提案はありますか?

ありがとう。

0 投票する
6 に答える
714 参照

c++ - クラスに非純粋なデストラクタがある場合でも、クラスを純粋な抽象にすることはできますか?

私は、基本クラスのげっ歯類を取り、それを純粋な抽象クラスにするように求める演習に取り組んでいます。純粋な抽象クラスについての私の理解は、それがインターフェースとして機能し、純粋な仮想関数のみを含むということです。これは簡単な演習ですが、本で提供されている解決策に問題があります。

ご覧のとおり、作成者はデストラクタにダミーの定義を追加しています。この定義の追加は、これが抽象クラスであり、「純粋な」抽象クラスではないことを意味しませんか?

0 投票する
4 に答える
4642 参照

php - C ++のようにPHPに純粋仮想関数はありますか?

多くの人がこれが可能かどうか疑問に思っていたと思いますが、重複する質問は見つかりません...訂正してください。

PHPが純粋仮想関数を提供しているかどうかを知りたいだけです。次が欲しい

どうもありがとう。

0 投票する
6 に答える
264 参照

c++ - 基本クラス関数からオーバーライドされた仮想関数を呼び出す方法は?

コードを単純化しすぎて、実際の問題を反映していないことに気付きました。詳しくなくてすみません。私が実際にやろうとしていることは次のとおりです。

オンラインデモ:

コンストラクターが呼び出されたときにまだ作成されていない A::fため、プログラムは純粋仮想関数を呼び出すと思います。B

これは正しいですか、どうすればこの問題を解決できますか?

先に単純すぎる問題を出してしまったことをお許しください。

0 投票する
4 に答える
6181 参照

c++ - 基本クラス自体に「純粋」仮想関数を定義することは意味がありますか?

基本クラスで共通の仮想関数を定義する利点は、派生クラスでそれらを再定義する必要がないことです。

基本クラス自体で純粋仮想関数を定義したとしても、派生クラスでもそれらを定義する必要があります。

これは確かに派手に見えるかもしれませんが、基本クラス自体に純粋仮想関数を定義する ことが有益な状況はありますか?

0 投票する
5 に答える
491 参照

c++ - 純粋な抽象メソッドを他の基本クラスのメソッドで満たす最も簡単な方法は何ですか?

編集:いくつかのコメントによると、単純とは、a) コードが少なく、b) 保守が容易で、c) 間違いにくいことを意味します。

編集 #2:また、プライベート継承の代わりに包含を使用することは、実装が実際に簡素化される場合、好ましくありませんInterfaceImpl

現在、これを行う唯一の方法は、実装者に抽象メソッドを定義させ、呼び出しをターゲットの基本型のメソッドに委任することです。例:

最初は、おそらくこれで問題が解決するのではないかと思いました。

最初の using ステートメントは両方のMethodOneImpl::method1メソッドをパブリックにしますが、実際には との契約を履行せずInterface、 のアクセシビリティを変更しますMethodOneImpl::method1(int)。そして明らかにmethod2、名前が一致しないため、このソリューションを使用できませんでした。

FWIW、私は解決策だと思うものを持っていますが、それは標準の一部ではありません(つまり、コンパイルされません)。私は C++ 委員会に提案をしようと考えていました。誰かアドバイスがあれば、以下のコメントをいただければ幸いです (ただし、アドバイスを回答として提出しないでください)。

0 投票する
5 に答える
4852 参照

c++ - クラス内の純粋な仮想デストラクタ定義でコンパイル エラーが発生する

in 基本クラスにはpure virtual destructor定義が必要です。そうしないと、コンパイラはリンク時に派生クラス デストラクタから基本クラス デストラクタへの呼び出しを生成し、リンク エラーが発生します。

以下のように、基本クラス内で純粋仮想デストラクタを定義しようとしました。

これにより、コンパイルエラーが発生しました:

エラー: 関数定義の純粋指定子

次に、以下のように基本クラスの外で関数を定義しようとしました:

これにより、コンパイル エラーが解消され、私の理解どおりに動作します。

しかし、私の質問は、基本クラスの外部で純粋仮想デストラクタを定義すると、コンパイル エラーがどのように削除されるのでしょうか?