上級 › 派生クラスを値渡しすると情報が失われるオブジェクトスライシング › パターン3
派生クラスを値渡しすると情報が失われるオブジェクトスライシング
派生クラスのオブジェクトを基底クラス型の変数に値としてコピーすると、派生クラス独自の部分が切り捨てられ、仮想関数の呼び出しも基底クラスのものになってしまうバグです。
1 #include <iostream> 2 class Employee { 3 public: 4 virtual std::string role() { return "employee"; } 5 }; 6 class Manager : public Employee { 7 public: 8 std::string role() override { return "manager"; } 9 }; 10 int main() { 11 Manager m; 12 _________ e = m; ^ 13 std::cout << e.role() << std::endl; 14 return 0; 15 }
出力: employee(managerが呼ばれない)期待: manager
空欄を埋めてコンパイル・実行を通す
ポインタや参照ではなく値でコピーする限り、代入先は常に基底クラスそのものになります。多態性を保つには参照かポインタで扱う必要があります。
次の問題