これらの使用の主な理由は、polymorphismを可能にすることです。多型に必要な別の技法はlate/dynamic bindingです。
アップキャスティングでは、継承したクラス(サブクラス)をベースクラスのインターフェイスで使用することができます。それは、どのような具体的な子クラスオブジェクトであるかを知る必要はなく、同じ基本クラスインタフェースを持つオブジェクトを扱うことができます。
一方、アップキャストが必要な場合は、子オブジェクトの特別なメソッドやメンバー変数を取得したい場合は、アップキャストが必要です。
キャストアップまたはキャストダウンは、dynamic_cast
(hereと記載されています)を安全に使用できます。
キャストが成功した場合、dynamic_castはnew_type型の値を返します。キャストが失敗し、new_typeがポインタ型の場合、その型のnullポインタを返します。キャストに失敗し、new_typeが参照型である場合、型std::bad_castのハンドラに一致する例外がスローされます。ベースと子クラス間のアップまたはダウンキャストへ
オブジェクトへの唯一のビューは、具体的なオブジェクトそのものではない変更されたため、あなたはポインタ(type*
)または参照型(type&
)のいずれかが必要です。タイプ(type
)を使用する場合は、object slicingが発生し、継承されたクラスの情報が失われます。
アップキャストとダウンキャストを使用する例を1つ挙げます。親クラスCar
とから継承された2つのクラスPorsche
とFord
があるとします。今では別の車に入れたいところなど、std::vector<Car*> cars
があります。
std::vector<Car*> cars;
cars.push_back(new Porsche()); /* implicit upcast */
cars.push_back(new Ford()); /* implicit upcast */
「異なる」オブジェクトのベクトルが1つあるという利点は、両方とも同じ親クラスを持つためです。
あなたは今、あなたが行うことができ、これらの車を取得したい場合は
:
Car* porscheAsCar = cars.at(0);
Porsche* porsche = dynamic_cast<Porsche*>(cars.at(0));
今すぐ例えばCar
クラスがdrive()
方法および実装Porsche
クラスdriveFast()
メソッドを持っています。あなたはそれらにアクセスします。
porscheAsCar->drive(); /* Call Porsche drive() method */
porsche->drive(); /* Call Porsche drive() method */
porsche->driveFast(); /* Call Porsche driveFast() method */
の方法がvirtualで宣言されている場合、我々は、それがPorsche
のdrive
方法になります、基本クラスのインターフェイスを持つdrive
メソッドを呼び出していますが。ダウンキャストでは、継承されたクラスに固有のmethods/member変数にアクセスできます。しかし、Car
が実際にPorsche
であり、たとえばFord
でない場合にのみ可能です。
ideone see hereの一部の出力例です。
あなたが 'A * a 'を持っているなら、[良いC++の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – NathanOliver
のように聞こえます。 (B *)a;を使用することができます。(B *)a; – user463035818