上級 › 派生クラスを値渡しすると情報が失われるオブジェクトスライシング › パターン2
派生クラスを値渡しすると情報が失われるオブジェクトスライシング
派生クラスのオブジェクトを基底クラス型の変数に値としてコピーすると、派生クラス独自の部分が切り捨てられ、仮想関数の呼び出しも基底クラスのものになってしまうバグです。
1 #include <iostream> 2 class Vehicle { 3 public: 4 virtual std::string name() { return "vehicle"; } 5 }; 6 class Car : public Vehicle { 7 public: 8 std::string name() override { return "car"; } 9 }; 10 int main() { 11 Car c; 12 ________ v = c; ^ 13 std::cout << v.name() << std::endl; 14 return 0; 15 }
出力: vehicle(carが呼ばれない)期待: car
空欄を埋めてコンパイル・実行を通す
「基底クラス型の変数に代入しても、中身が派生クラスなら派生クラスとして振る舞う」というのは誤解です。値としてコピーした瞬間、vtable(仮想関数の呼び出し先情報)も失われます。
次の問題