まずはこちらのC++の挙動を見ていただこう。
class ICar { public: virtual void run() = 0; protected: virtual ~ICar() = default; }; class ICamping { public: virtual void camping() = 0; protected: virtual ~ICamping() = default; }; class Car: public ICar { public: Car() {} void run() override { } }; class CampingCar: public ICar, public ICamping { public: CampingCar() { } void run() override { } void camping() override { } }; int main(int argc, const char * argv[]) { auto car = std::make_unique<Car>(); printf("%p %p\n", car.get(), static_cast<ICar*>(car.get())); // 0x100865cb0 0x100865cb0 auto campingCar = std::make_unique<CampingCar>(); printf("%p %p %p\n", campingCar.get(), static_cast<ICar*>(campingCar.get()), static_cast<ICamping*>(campingCar.get())); // 0x100860c10 0x100860c10 0x100860c18 return EXIT_SUCCESS; }
継承するクラスが1つの時はアップキャストしてもアドレスは変わらないが、 継承するクラスが2つの時は最初に継承したクラスへアップキャストしたときはアドレスが変わらないが、 2つ目の継承クラスへアップキャストした時はアドレスが変わっていることが分かる。 static_castはC言語の型キャストとはかなり異なる機能を持っていることが分かる。