私は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にアクセスできます。それでは、なぜポインターを使用してオブジェクトをそれに割り当てるのですか?
あなたが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]
コメントを追加