ポリモーフィズムに使用される参照とポインター?

ヨギ

私はc ++を勉強しています。実行時のポリモーフィズムを理解するのに問題がありますか?クラスのオブジェクトを作成して同じ作業を行うことができるのに、なぜ参照/ポインタを使用する必要があるのですか?

`例:

class A{
private:
    int p;
public:
    A(){}   //ctor
    void Print(){}
    void display(){}
    void showrecord(){}
} 
class B:public A
{
Private:
     int q;
public:
    B(){}    //ctor
    void Print(){}  
    void displayrecord(){}
}

上記の場合、オブジェクトを使用してBクラスの任意のメソッドにアクセスでき、スコープ解決を使用してAクラスメソッドbにアクセスできます。それでは、なぜポインターを使用してオブジェクトをそれに割り当てるのですか?

legends2k

あなたが3台の異なる車を持っているとしましょう。そして、あなたはそれらを駆動するさまざまなメカニズムを持っています。ドライバーは基礎となるエンジンについて知る必要はありませんが、車を運転する方法のプロトコル、つまり加速のためにこのペダルを押す、ブレーキのためにそのペダルを押すなどのプロトコルだけを知る必要があります。

今、ドライバーの観点からは、ホンダ、フォード、ビュイックのいずれであるかは問題ではありません。彼の観点からは、それはただのです。同様に、車が駐車されている場所に小屋を置いた場合、それらを車小屋と呼びます。それは車を収容し、それぞれが何であるかについて気にしません。そう

std::vector<Car*> v;
v.push_back(new Ferrari());
v.push_back(new Honda());
v.push_back(new Ford());

クラスのオブジェクトを作成して同じ作業を行うことができるのに、なぜ参照/ポインタを使用する必要があるのですか?

ポインタまたは参照がないと、共通性はあるが特定の意味で異なるオブジェクトのコレクションを作成することはできません。これは、Java、C#などの一部の厳密なOOP言語では、すべてのオブジェクトをと呼ばれる基本クラスから派生させることで回避されObjectます。C ++はマルチパラダイム言語であり、プログラマーは自分のプロジェクトに応じてそのような決定を自由に行うことができます。C ++でそれを行う方法は、基本クラスのポインターを使用することです。このイディオムは、ランタイムポリモーフィズムと呼ばれます。

for (const auto &this_car : v)
     this_car->drive();

ここでは、実際のメーカーに関係なくv、基本クラスcarがタイプの一部である限り、ベクターは車を保持できます。同様に、メーカーdriveごとに異なりますが、それを呼び出す関数でそれを知る必要はありません。

編集:

この投稿は実際には質問に答えていないことを指摘してくれたnijansenに感謝します:実行時のポリモーフィズムにポインターまたは参照(動的型)が必要なのはなぜですか?それは彼らがそれを達成するために使用したことがあると言うだけで、なぜ通常の(静的型)変数を使用できないのかを説明していません。

C ++は、オブジェクトの型がコンパイル時に完全に認識される場合とされない場合があり、その型だけが手元にあるように設計されています。ではCircle c;、私たちが知っているc型ですCircle一方、Shape *p = make_shape();私たちは実際にどのオブジェクトpが指しているのかわかりませんpの独自の型はですShape*が、ポイントされたオブジェクトの具体的な型は不明です。私たちが知っているのは、それがから派生したオブジェクトを指しているということだけですShape動的または自動のメモリ割り当てと混同しないでください。これは自動変数についても同じですShape *p = &c;ここでもp単独で、コンパイラはオブジェクトがどの具体的なタイプであるかを認識していませんpこれはを指します。

我々は書かれていたp静的(非ポインタ、非参照)型としてShape p = make_shape();Shape p = c;、本当にに起こるスライスすなわちp、具体的なタイプのものであろうShapeと、それはポインタではありませんので、コピーよ(形状)の一部Circleのオブジェクトをcどの、それにほとんどの場合望ましくありません。

基になる型を知らずに、適切な具象型の関数をどのように呼び出すのでしょうか。C ++は、その仕事をするための仮想関数を提供します。これが、ランタイムポリモーフィズムが常にC ++の仮想メソッドで説明される理由です。JavaやC#のような言語では、すべてのメソッドは仮想であり、すべてのオブジェクトタイプは参照/ポインターです。ある意味で、あなたの質問に対する答えは、実行時のポリモーフィズムのために参照/ポインター変数が必要になるように言語が設計されているということです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ポリモーフィズムとポインターを使用した構造体によるキャスト

分類Dev

スマートポインタによるポリモーフィズム

分類Dev

静的ポリモーフィズムを使用してint型とポインタ型を変換するにはどうすればよいですか?

分類Dev

インターフェイスで継承とポリモーフィズムを効果的に利用する方法

分類Dev

Haskellでサポートされているポリモーフィズムタイプはどれですか?

分類Dev

ポリモーフィズムへのポインタがあるときに「ゼロのルール」を使用する

分類Dev

一緒に使用されるC ++テンプレートポリモーフィズム

分類Dev

Javaのポリモーフィズムとインターフェース

分類Dev

Javaのポリモーフィズムとインターフェース

分類Dev

ポリモーフィズムとインターフェース-明確化?

分類Dev

なぜポリモーフィズムでポインターを使用するのですか?

分類Dev

カスタムタイプがバインドされたシェイプレスマッピングとサブタイプポリモーフィズム

分類Dev

インターフェイスとクラスを使用したポリモーフィズム

分類Dev

参照とともにポリモーフィズムを使用します。非const参照の無効な初期化

分類Dev

ポインタの再割り当てがポリモーフィズムにどのように影響するか

分類Dev

C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

分類Dev

C ++デザインとポリモーフィズム

分類Dev

残り火の自己参照とポリモーフィズム

分類Dev

残り火の自己参照とポリモーフィズム

分類Dev

右辺値参照とポリモーフィズム

分類Dev

ロック法に適用されるポリモーフィズム

分類Dev

転送参照を使用した静的ポリモーフィズム

分類Dev

ポリモーフィズムC ++:派生クラスコンストラクターによって指定された値を使用しないベースポインターのフィールド

分類Dev

ポインターを使用せずにCでポリモーフィズムをシミュレートする

分類Dev

AbstractFactoryを使用する場合のIXmlSerializable.ReadXmlの実装方法-パターンとポリモーフィズム

分類Dev

リポジトリパターンのジェネリックスによるポリモーフィズム

分類Dev

C#ポリモーフィズム-継承されたタイプを指定する

分類Dev

変数にポリモーフィズムを使用する方法

分類Dev

ジャクソンフィルターとポリモーフィズム

Related 関連記事

  1. 1

    ポリモーフィズムとポインターを使用した構造体によるキャスト

  2. 2

    スマートポインタによるポリモーフィズム

  3. 3

    静的ポリモーフィズムを使用してint型とポインタ型を変換するにはどうすればよいですか?

  4. 4

    インターフェイスで継承とポリモーフィズムを効果的に利用する方法

  5. 5

    Haskellでサポートされているポリモーフィズムタイプはどれですか?

  6. 6

    ポリモーフィズムへのポインタがあるときに「ゼロのルール」を使用する

  7. 7

    一緒に使用されるC ++テンプレートポリモーフィズム

  8. 8

    Javaのポリモーフィズムとインターフェース

  9. 9

    Javaのポリモーフィズムとインターフェース

  10. 10

    ポリモーフィズムとインターフェース-明確化?

  11. 11

    なぜポリモーフィズムでポインターを使用するのですか?

  12. 12

    カスタムタイプがバインドされたシェイプレスマッピングとサブタイプポリモーフィズム

  13. 13

    インターフェイスとクラスを使用したポリモーフィズム

  14. 14

    参照とともにポリモーフィズムを使用します。非const参照の無効な初期化

  15. 15

    ポインタの再割り当てがポリモーフィズムにどのように影響するか

  16. 16

    C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

  17. 17

    C ++デザインとポリモーフィズム

  18. 18

    残り火の自己参照とポリモーフィズム

  19. 19

    残り火の自己参照とポリモーフィズム

  20. 20

    右辺値参照とポリモーフィズム

  21. 21

    ロック法に適用されるポリモーフィズム

  22. 22

    転送参照を使用した静的ポリモーフィズム

  23. 23

    ポリモーフィズムC ++:派生クラスコンストラクターによって指定された値を使用しないベースポインターのフィールド

  24. 24

    ポインターを使用せずにCでポリモーフィズムをシミュレートする

  25. 25

    AbstractFactoryを使用する場合のIXmlSerializable.ReadXmlの実装方法-パターンとポリモーフィズム

  26. 26

    リポジトリパターンのジェネリックスによるポリモーフィズム

  27. 27

    C#ポリモーフィズム-継承されたタイプを指定する

  28. 28

    変数にポリモーフィズムを使用する方法

  29. 29

    ジャクソンフィルターとポリモーフィズム

ホットタグ

アーカイブ