C++ におけるダブルディスパッチ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2017/12/19 13:38 UTC 版)
「ダブルディスパッチ」の記事における「C++ におけるダブルディスパッチ」の解説
上述の問題は、Visitor パターンで用いられているものと同様の手法で解決できる。SpaceShip と GiantSpaceShip がいずれも関数 virtual void CollideWith(Asteroid& inAsteroid) { inAsteroid.CollideWith(*this);} を持っているとすると、先ほどの例ではうまく動作しなかったが、以下の例はうまく動作する。 SpaceShip& theSpaceShipReference = theGiantSpaceShip;Asteroid& theAsteroidReference = theExplodingAsteroid;theSpaceShipReference.CollideWith(theAsteroid);theSpaceShipReference.CollideWith(theAsteroidReference); この例は、期待通りに Asteroid hit a GiantSpaceShip および ExplodingAsteroid hit a GiantSpaceShipと表示する。 鍵はtheSpaceShipReference.CollideWith(theAsteroidReference); であり、 これはランタイムに下記のような動作をする。 theSpaceShipReference は参照であり、C++ は vtable から正しいメソッドを探し出し、GiantSpaceShip::CollideWith(Asteroid&)を呼び出す。 GiantSpaceShip::CollideWith(Asteroid&) 内では、inAsteroid は参照であるため、inAsteroid.CollideWith(*this) はもう一つの仮想関数テーブルの検索を行うことになる。この場合には、inAsteroid は ExplodingAsteroid への参照であり、ExplodingAsteroid::CollideWith(GiantSpaceShip&) が呼び出される。
※この「C++ におけるダブルディスパッチ」の解説は、「ダブルディスパッチ」の解説の一部です。
「C++ におけるダブルディスパッチ」を含む「ダブルディスパッチ」の記事については、「ダブルディスパッチ」の概要を参照ください。
- C におけるダブルディスパッチのページへのリンク