こんにちは。
スライシングは、[派生クラスのインスタンスを基底クラスのインスタンスへコピーする際に発生する意外な動作」を指すことが多いようです。
- 派生クラスにのみ存在するデータメンバの記憶領域は、基底クラスには当然存在しないのでコピーされません。
- 仮想関数テーブルは記憶領域が存在しますが、コピーされません。
2.の例は「C++のスライシング」が簡潔で判りやすいと思います。原理はここで解説したことがあります。(流れで解説しているので単独で見ると判りにくいですが。)
1.の例はスライシングが発生していることを見えるようにするのがちょっと難しいです。コピーした先の基底クラスのインスタンスで派生クラスのデータ・メンバには当然アクセスできませんから。
c++ - オブジェクトのスライスとは何ですか?にある「邪悪な事件」を元にちょっと例を作ってみました。
C++
1#include <iostream>
2
3class A
4{
5 int foo;
6public:
7 A(int iFoo) : foo(iFoo) { }
8 void print()
9 {
10 std::cout << "foo=" << foo;
11 }
12};
13
14class B : public A
15{
16 int bar;
17public:
18 B(int iBar) : A(iBar*10), bar(iBar) { }
19 void print()
20 {
21 A::print();
22 std::cout << " bar=" << bar << "\n";
23 }
24};
25
26int main()
27{
28 B b1(1);
29 B b2(2);
30 A& a_ref = b2;
31 std::cout << "1) ";
32 b2.print();
33
34 a_ref = b1;
35 std::cout << "2) ";
36 b2.print();
37}
結果は次のようになります。
- foo=20 bar=2
- foo=10 bar=2
Wandbox
退会済みユーザー
2017/12/17 07:31
退会済みユーザー
2017/12/17 07:33
2017/12/17 15:05
退会済みユーザー
2017/12/17 23:54
退会済みユーザー
2017/12/18 04:24
2017/12/18 04:54