上級 › 派生クラスを値渡しすると情報が失われるオブジェクトスライシング › パターン1
派生クラスを値渡しすると情報が失われるオブジェクトスライシング
派生クラスのオブジェクトを基底クラス型の変数に値としてコピーすると、派生クラス独自の部分が切り捨てられ、仮想関数の呼び出しも基底クラスのものになってしまうバグです。
1 #include <iostream> 2 class Animal { 3 public: 4 virtual std::string speak() { return "..."; } 5 }; 6 class Dog : public Animal { 7 public: 8 std::string speak() override { return "Woof"; } 9 }; 10 int main() { 11 Dog d; 12 _______ a = d; ^ 13 std::cout << a.speak() << std::endl; 14 return 0; 15 }
出力: ...(Woofが呼ばれない)期待: Woof
空欄を埋めてコンパイル・実行を通す
Animal a = d;は値としてコピーするため、Dog独自の部分が切り捨てられ、正真正銘のAnimalオブジェクトになります(オブジェクトスライシング)。参照(Animal&)で受け取ればスライシングを避けられます。
次の問題