Code Fix

上級 › 派生クラスを値渡しすると情報が失われるオブジェクトスライシング › パターン5

派生クラスを値渡しすると情報が失われるオブジェクトスライシング

派生クラスのオブジェクトを基底クラス型の変数に値としてコピーすると、派生クラス独自の部分が切り捨てられ、仮想関数の呼び出しも基底クラスのものになってしまうバグです。

 1  #include <iostream>
 2  class Instrument {
 3  public:
 4      virtual std::string play() { return "..."; }
 5  };
 6  class Piano : public Instrument {
 7  public:
 8      std::string play() override { return "Ding"; }
 9  };
10  int main() {
11      Piano p;
12      ___________ i = p;
             ^
13      std::cout << i.play() << std::endl;
14      return 0;
15  }
出力: ...(Dingが呼ばれない)期待: Ding

空欄を埋めてコンパイル・実行を通す

広告
広告スロット(未設定)

派生クラスを値渡しすると情報が失われるオブジェクトスライシング

このエラーの解説と類題をまとめて見る →

広告
広告スロット(未設定)