web-dev-qa-db-ja.com

ポリモーフィズムに関して、参照とポインターは同じですか?

私はいつもポリモーフィズムのためにポインターを使わなければならないと思っています。正規の例を使用すると:

DrawEngine::render(Shape *shape)
{
    shape->draw();
    shape->visible(true);
}

そして、さまざまなShape派生クラスへのポインタを渡します。参照でも同じように機能しますか?

DrawEngine::render(Shape &shape)
{
     shape.draw();
     shape.visible(true);
}

次のことを行うことも有効ですか?

engine.render(myTriangle); // myTriangle instance of class derived from Shape

これが機能する場合、2つのケースに違いはありますか? Stroustrupで情報を見つけようとしましたが、何も見つかりませんでした。

少しだけ探求したかったので、これを再開しました。

したがって、少なくとも1つの違いはdynamic_castです。私にとって、ポリモーフィズムにはdynamic_castの使用が含まれます。

行ってもいい

Rhomboid & r = dynamic_cast<Rhomboid &>(shape);

キャストが失敗した場合はどうなりますか?これは何か違いがありますか?

Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);
42
pm100

ポリモーフィズムに関しては、参照はポインターと同じように機能します。

47
Alex Emelianov

dynamic_castに関して、キャストが失敗すると、ポインターを含むnullポインターが生成され、参照を含むbad_cast(IIRC)例外がスローされます。

1つの理由は、有効なnull参照などがないことです。

そしておそらく別の理由(しかしそれは意図せずに役立つ緊急機能である可能性があります)は、例外が必要な場合と、チェックしやすいnullpointerが必要な場合があり、参照またはポインターが手元にあるかどうかに関係なく、必要な動作を取得するためのほとんどの間接参照演算子またはアドレス演算子。

乾杯&hth。、

10

ポインタは他の方法でも役立ちます。文字列を渡し、それを関数のchar *パラメータとして受け入れるようなものです。

文字列を所定の位置で反転する古い例を考えてみましょう。

void reversestring(char* myString)
{
int firstPos=0;
int lastPos=myString.length - 1;
while (firstPos < lastPos)
{
  char temp=myString[firstPos];
  myString[firstPos]=myString[lastPos];
  myString[lastPos]=temp;
  firstPos++;
  lastPos--;
}
}

参照を使用してこのような文字列操作のコードを書くことはそれほど簡単ではありません。

0
vinayvasyani