問題タブ [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++ - 純粋仮想メソッドを実装せずにテンプレートクラスをサブクラス化する
私は次のクラス定義を持っています:
次のサブクラスを作成しました。
constructItem()これはVS2005で正常にコンパイルされますが、MyQueueクラスには実装していません。なぜですか?
c++ - 仮想関数と純粋仮想関数の違い
純粋仮想関数と仮想関数の違いは何ですか?
「純粋な仮想関数は本体のない仮想関数です」は知っていますが、これは何を意味し、以下の行で実際に何が行われるのですか:
c++ - 共有ライブラリの抽象クラス
いくつかの純粋仮想メソッドを持つ通常の抽象クラスがあります。クラス自体は共有ライブラリの一部です。共有ライブラリ自体のコンパイルはOKです。しかし、ライブラリが、共有ライブラリの抽象クラスから派生し、純粋仮想メソッドを定義する別のクラスを持つ別のプログラムにリンクされている場合、次のリンカ エラーが発生します。
私はこのようにコンパイルします..:
リンカー エラーは次のとおりです。
libsomename.so: `AbstractClass::method()' への未定義の参照
抽象クラスが純粋な仮想メソッドにアクセスできないようですが、ライブラリ内のどこにも抽象クラスのインスタンスを作成しようとしません。
何が問題なのですか?
c++ - これらの状況で必要な基本クラスへの転送は、標準のどこにありますか?
おそらくさらに良いのは、これらの状況で標準が基本クラスへの転送を要求するのはなぜですか?(ええええええ-なぜですか?-なぜなら)
MSは以下を提供します:
MSコンパイラについても同様です。
私は最初のケースを買うかもしれません、D。しかし、D2-fはusing宣言によって明確に定義されていますが、コンパイラがvtableに入力する必要があるのになぜそれだけでは不十分なのですか?
この状況は標準のどこで定義されていますか?
回答に応じて追加
私が受け入れた以下の答えについて:
なぜこれが仕様のエラーに見えないのですか?-一連の非仮想f()を持つ継承階層があり、派生クラスでの使用がステートメントを使用して決定され、基本クラスのfのdeclが仮想に変更される場合、これにより、 fは、fを選択するためのステートメントを使用して派生クラスで呼び出されます。それは私が気づかなかったc++の「落とし穴」です。それは言語の一部かもしれませんが、そのような「遠隔作用」は私を不安にさせ、私にはある種の正確性/維持の原則に違反しているように見えます(私は今は完全に定式化できません)。
しかし、私は例をあげることができます:
出力:
変更されるのは、C0のfの仮想性だけです。特に、基本クラスのfの非仮想性が選択されると、すぐ上の例のように、派生クラス(一般に知ることができない)が「オーバーライド」された場合、メンテナンスの問題なしに変更することはできません。
「まあ、NonVirtualの場合はそのようにオーバーライドしないでください」と反論する場合、それは悪い習慣であることに同意しますが、これはそれだけではないようです。私にとって、言語は次のようにすべきです。
NonVirtual :: D3での使用を許可しない([関数の場合に許可された署名を使用しない限り]他のオーバーロードされたfが取り込まれる可能性があるため、現在は不可能です)
また
関数のステートメントの使用を完全に禁止し、転送を強制します
また
すべての場合に実際にオーバーライドを使用しています
また
次のような関数(基本的には関数を使用)の構文宣言を許可します。
正確には、私はここで何が欠けていますか?誰かが標準でこの選択の「理由」を明確にするシナリオを思い付くことができますか?
c++ - 関数定義の純粋指定子
GCC でコンパイルしているときにエラーが発生します: pure-specifier on function-definitionですが、VS2005 を使用して同じコードをコンパイルすると発生しません。
ただし、この純粋仮想関数の定義がインラインでない場合は、次のように機能します。
エラーの意味は何ですか? インラインでできないのはなぜですか?2 番目のコード サンプルに示されているように、コンパイルの問題を回避することは合法ですか?
c++ - プライベート部分をC ++ヘッダーの外に保持する:純粋な仮想基本クラスとpimpl
私は最近、Java と Ruby から C++ に切り替えましたが、驚いたことに、プライベート メソッドのメソッド シグネチャを変更すると、パブリック インターフェイスを使用するファイルを再コンパイルする必要があります。これは、プライベート部分も .h ファイルにあるためです。
私はすぐに、おそらく Java プログラマーにとって典型的な解決策、つまりインターフェース (= 純粋仮想基底クラス) を思いつきました。例えば:
BananaTree.h:
BananaTree.cpp:
ここでの唯一の問題は、 を使用できずnew、代わりに を呼び出さなければならないことBananaTree::create()です。とにかく工場をたくさん使うことを期待しているので、それは本当に問題ではないと思います。
しかし、C++ で有名な賢者たちは、別の解決策pImpl イディオムを思い付きました。それで、正しく理解できれば、私のコードは次のようになります。
BananaTree.h:
BananaTree.cpp:
これは、 のすべてのパブリック メソッド (BananaTreeこの場合は ) に対して、デコレータ スタイルの転送メソッドを実装する必要があることを意味しgetBananaます。これは、私が要求したくない複雑さとメンテナンスの労力の追加レベルのように思えます。
では、ここで質問です。純粋仮想クラスのアプローチの何が問題なのですか? pImpl アプローチのほうが文書化されているのはなぜですか? 何か見逃しましたか?
c++ - boost::threadラッパーインターフェイスを実装するときに「呼び出される純粋仮想メソッド」
私はスレッドに関連するものを一元化する小さなラッパーを持っています:
私がそれを実装するとき、次のように言います:
で :
かなりの「純粋仮想メソッドと呼ばれる」が表示されたランタイム終了が発生しました。これはboost::bind引数だと思いますが、「仮想の純粋な実装を使用する」と言う方法がわかりません...
よろしくお願いします。
よろしく、
ミスターミステール
c++ - 純粋仮想関数と抽象クラス
次のクラス Base と Derived があり、コンパイラをコンパイルすると、抽象的であるため DLog のインスタンスを作成できないと不平を言います。
このエラーを修正する方法を教えてもらえますか?
純粋仮想関数の両方が Derived に実装されていないわけではないためだと思います。
// シングルトンとしての DLog インスタンス
c++ - 純粋仮想クラスの c++ 前方宣言
前進減速の問題があります。私は以前に と呼ばれる通常のクラスを持っていましたがGlobalCWND、それはインスタンス化され、別のクラスで使用されましたProtocolContext。
で ProtocolContext クラスを前方宣言しRequestor.hます。
この 2 つのクラスのコードの関連部分を見ることができます。
============プロトコルコンテキスト========
=================Requestor.h=========
以前は正常に動作していました。今、私はGlobalCWND仮想クラスに変更し、プロトコル コンテキスト コンストラクターには次のコードがあります。
しかし、今、私はこのエラーが発生します:
エラー行は次のとおりです。
Ptr クラスは実際にはオブジェクトへのポインターを作成しています。ptr.h の 441 行目はこの関数の最後の行です。
のコードは次のGlobalCWNDように始まります。
c++ - 基本クラスから関数の定義を「インポート」して抽象インターフェイスを実装する (C++ での多重継承)
2 つの基本クラスから継承するクラスがあるとします (多重継承)。ベースclass Aは抽象的で、純粋な仮想関数を宣言しfoo、他のベースはまったく同じシグネチャのclass B関数を宣言および実装します。foo
派生したfoofrom baseの実装を使用したいと考えています。ただし、派生した関数をもう一度実装しないと、そのオブジェクトをインスタンス化できません (抽象化されたままです)。仮想継承は、ここでは予想どおり役に立ちません (また、共通の基本クラスがありません)。class Bclass Cfooclass Cclass Aclass B
同じコードを繰り返す必要がないように、foofromの実装を「インポート」する方法があるのだろうか。class Bclass C
上記の例はもちろんわざとです。fooで実装したい理由は、の実装class Bを派生させclass D : public Bて使用したいからです。継承が (主に) コードの再利用を目的としていないことはわかっていますが、それでもそのように使用したいと考えています。class Bfoo