タグ付けされた質問 「polymorphism」

コンピュータサイエンスでは、ポリモーフィズムは、さまざまなデータ型の値を統一された方法で処理できるようにするプログラミング言語の機能です。

3
GetType()は、基本クラスから呼び出されたときに最も派生した型を返しますか?
GetType()は、基本クラスから呼び出されたときに最も派生した型を返しますか? 例: public abstract class A { private Type GetInfo() { return System.Attribute.GetCustomAttributes(this.GetType()); } } public class B : A { //Fields here have some custom attributes added to them } または、派生クラスが次のように実装する必要がある抽象メソッドを作成する必要がありますか? public abstract class A { protected abstract Type GetSubType(); private Type GetInfo() { return System.Attribute.GetCustomAttributes(GetSubType()); } } public …



12
仮想関数とvtableはどのように実装されますか?
私たちは皆、C ++の仮想関数を知っていますが、それらは深いレベルでどのように実装されますか? 実行時にvtableを変更したり、直接アクセスしたりできますか? vtableはすべてのクラスに存在しますか、それとも少なくとも1つの仮想関数を持つクラスのみに存在しますか? 抽象クラスは、少なくとも1つのエントリの関数ポインタにNULLを持っているだけですか? 単一の仮想関数を使用すると、クラス全体が遅くなりますか?それとも仮想関数の呼び出しだけですか?また、仮想関数が実際に上書きされているかどうかに関係なく、速度が影響を受けますか、それとも仮想である限り、効果はありません。

7
RTTIを使用するよりも「純粋なポリモーフィズム」が望ましいのはなぜですか?
この種のことを説明しているほとんどすべてのC ++リソースは、RTTI(ランタイム型識別)を使用するよりもポリモーフィックなアプローチを好むべきだと私に教えています。一般に、私はこの種のアドバイスを真剣に受け止め、その根拠を理解しようとします-結局のところ、C ++は強力な獣であり、その完全な深さを理解することは困難です。ただし、この特定の質問については、空白を描いています。インターネットがどのようなアドバイスを提供できるかを確認したいと思います。まず、RTTIが「有害であると見なされている」理由として引用されている一般的な理由を挙げて、これまでに学んだことを要約しましょう。 一部のコンパイラはそれを使用しません/ RTTIは常に有効ではありません 私は本当にこの議論を買いません。これは、C ++ 14の機能を使用するべきではないと言っているようなものです。C++ 14の機能をサポートしていないコンパイラが世に出ているからです。それでも、C ++ 14機能の使用を思いとどまらせる人はいません。プロジェクトの大部分は、使用しているコンパイラーとその構成方法に影響を与えます。gccのマンページを引用しても: -fno-rtti C ++ランタイム型識別機能(dynamic_castおよびtypeid)で使用する仮想関数を持つすべてのクラスに関する情報の生成を無効にします。言語のこれらの部分を使用しない場合は、このフラグを使用してスペースを節約できます。例外処理は同じ情報を使用しますが、G ++は必要に応じてそれを生成することに注意してください。dynamic_cast演算子は、実行時の型情報を必要としないキャスト、つまり「void *」または明確な基本クラスへのキャストに引き続き使用できます。 これは、RTTIを使用していない場合は無効にできることを示しています。つまり、Boostを使用していない場合は、Boostにリンクする必要はありません。誰かがでコンパイルする場合を想定する必要はありません-fno-rtti。さらに、この場合、コンパイラは大音量でクリアします。 追加のメモリが必要/遅くなる可能性がある RTTIを使いたくなったときはいつでも、ある種の型情報やクラスの特性にアクセスする必要があります。RTTIを使用しないソリューションを実装する場合、これは通常、この情報を格納するためにいくつかのフィールドをクラスに追加する必要があることを意味します。そのため、memory引数は一種の無効です(この例は後で説明します)。 実際、dynamic_castは遅くなる可能性があります。ただし、スピードが重要な状況での使用を回避する方法は通常いくつかあります。そして、私は代替案をまったく見ていません。このSOの回答は、基本クラスで定義された列挙型を使用して型を格納することを提案しています。これは、すべての派生クラスを事前に知っている場合にのみ機能します。それはかなり大きな「もし」だ! その回答から、RTTIのコストも明確ではないようです。異なる人々は異なるものを測定します。 エレガントなポリモーフィックデザインはRTTIを不要にします これは私が真剣に受け止めている一種のアドバイスです。この場合、自分のRTTIユースケースをカバーする優れた非RTTIソリューションを思い付くことはできません。例を挙げましょう。 ある種のオブジェクトのグラフを処理するライブラリを書いているとしましょう。ライブラリを使用するときにユーザーが独自の型を生成できるようにしたい(そのため、enumメソッドは使用できません)。私のノードの基本クラスがあります: class node_base { public: node_base(); virtual ~node_base(); std::vector< std::shared_ptr<node_base> > get_adjacent_nodes(); }; 現在、私のノードはさまざまなタイプにすることができます。これらはどうですか: class red_node : virtual public node_base { public: red_node(); virtual ~red_node(); void get_redness(); …
107 c++  polymorphism  rtti 


9
gsonによる多態性
Gsonでjson文字列をデシリアライズする際に問題が発生しました。コマンドの配列を受け取ります。コマンドには、start、stop、その他のタイプのコマンドがあります。当然私はポリモーフィズムを持っています、そして開始/停止コマンドはコマンドから継承します。 gsonを使用して正しいコマンドオブジェクトにシリアル化するにはどうすればよいですか? 基本型のみを取得しているようです。つまり、宣言された型であり、実行時の型はありません。

4
例外が発生するまでGDBでアプリケーションを実行する
私はマルチスレッドアプリケーションで作業しており、GDBを使用してそれをデバッグしたいと考えています。 問題は、私のスレッドの1つが次のメッセージで消え続けることです。 pure virtual method called terminate called without an active exception Abort 私はそのメッセージの原因を知っていますが、私のスレッドのどこで発生するのかわかりません。バックトレースは本当に役に立ちます。 GDBでアプリを実行すると、スレッドが一時停止または再開されるたびに一時停止します。例外のあるスレッドの1つが停止するまでアプリを通常どおり実行し続けます。その時点ですべてが停止し、バックトレースを取得できます。

8
Javaでのinstanceofの回避
「instanceof」操作のチェーンを持つことは「コードのにおい」と見なされます。標準的な答えは「多態性の使用」です。この場合、どうすればよいですか? 基本クラスにはいくつかのサブクラスがあります。それらのどれも私の制御下にありません。同様の状況は、JavaクラスInteger、Double、BigDecimalなどです。 if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);} else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);} else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);} NumberStuffなどを制御できます。 数行で十分なコード行を使いたくありません。(時々、HashMapマッピングInteger.classをIntegerStuffのインスタンスに、BigDecimal.classをBigDecimalStuffのインスタンスに、などを作成します。しかし、今日はもっと単純なものが必要です。) 私はこれと同じくらい簡単なものが欲しい: public static handle(Integer num) { ... } public static handle(BigDecimal num) { ... } しかし、Javaはそのようには機能しません。 フォーマット時に静的メソッドを使用したいのですが。私がフォーマットしているものは複合であり、Thing1にはThing2の配列を含めることができ、Thing2にはThing1の配列を含めることができます。次のようにフォーマッタを実装すると問題が発生しました。 class Thing1Formatter { private static Thing2Formatter thing2Formatter = new Thing2Formatter(); public format(Thing …

6
JavaScriptのポリモーフィズムとは何ですか?
ポリモーフィズムについてインターネットで見つけた可能性のある記事をいくつか読んだことがあります。でも、その意味とその重要性がよくわからなかったと思います。ほとんどの記事では、なぜそれが重要であり、OOPで(もちろんJavaScriptで)多相的な動作を実現できるかについては触れていません。 それを実装する方法がわからないので、コード例を提供することはできません。 それは何ですか? なぜそれが必要なのですか? 使い方? JavaScriptでこのポリモーフィックな動作を実現するにはどうすればよいですか? 私はこの例を持っています。しかし、このコードの結果がどうなるかは簡単に理解できます。ポリモーフィズム自体についての明確な考えはありません。 function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; } } function Employee(age, weight, salary) { this.salary = salary; …

6
継承を使用してRESTfulAPIをモデル化する方法は?
RESTful APIを介して公開する必要のあるオブジェクト階層があり、URLをどのように構造化し、何を返す必要があるのか​​わかりません。ベストプラクティスが見つかりませんでした。 動物から受け継いだ犬と猫がいるとしましょう。犬と猫のCRUD操作が必要です。また、動物全般の手術もできるようになりたいです。 私の最初のアイデアは、次のようなことをすることでした。 GET /animals # get all animals POST /animals # create a dog or cat GET /animals/123 # get animal 123 / animalコレクションは、まったく同じ構造を持たないオブジェクト(犬と猫)を返したり受け取ったりする可能性があるため、「一貫性がない」ようになりました。異なる属性を持つオブジェクトを返すコレクションを持つことは「RESTful」と見なされますか? 別の解決策は、次のように、具体的なタイプごとにURLを作成することです。 GET /dogs # get all dogs POST /dogs # create a dog GET /dogs/123 # get dog 123 GET /cats # get all …

30
ポリモーフィズム-たった2つの文で定義する[クローズ]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 5年前に閉鎖されました。 この質問を改善する 私は他の定義と説明を見てきましたが、どれも私を満足させません。コードや例を使用せずに、最大2つの文でポリモーフィズムを定義できる人がいるかどうかを確認したいと思います。「だから、人/車/缶切りがあります...」またはその単語がどのように派生したかを聞きたくありません(ポリとモーフの意味を知っていることに誰も感心しません)。ポリモーフィズムとは何かを非常によく理解していて、英語を上手に使いこなせる場合は、この質問に、密度は高いものの、短い定義で答えることができるはずです。あなたの定義がポリモーフィズムを正確に定義しているが、それが数回の読み直しを必要とするほど密集している場合、それはまさに私が探しているものです。 なぜ2文しかないのですか?定義が短くてインテリジェントだからです。説明は長く、例とコードが含まれています。説明についてはこちらをご覧ください(これらのページの回答は私の質問には不十分です): ポリモーフィズムvsオーバーライドvsオーバーロードポリモーフィズムをできるだけ 簡単に説明するようにしてください なぜ私はこの質問をしているのですか?同じ質問をされたのですが、満足のいく定義を思い付くことができなかったのです(私の基準ではかなり高いです)。私はこのサイトの偉大な頭脳のいずれかがそれを行うことができるかどうかを見たいと思います。 2文の要件を実際に作成できない場合(定義するのが難しい主題です)、それを超えても問題ありません。アイデアは、実際にポリモーフィズムとは何かを定義し、それが何をするのか、またはそれをどのように使用するのかを説明しない定義を持つことです(違いを理解しますか?)。


2
役割グループのモジュールをどのように作成できますか?
ロールの機能はロールグループです。これにより、マルチルーチンと同様に、異なるパラメーターを受け入れる同じ名前で複数のロールを宣言できます。 role Foo[Int:D] { method is-int(::?CLASS:_: --> True) { } method is-str(::?CLASS:_: --> False) { } } role Foo[Str:D] { method is-int(::?CLASS:_: --> False) { } method is-str(::?CLASS:_: --> True) { } } 多くの場合、1つのタイプに対して、1つのモジュールがあります。問題はunit、モジュール内でスコープ宣言を1つしか持てないため、役割グループで使用できないことです。役割グループのモジュールをどのように作成できますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.