###前提・実現したいこと
C++について勉強しています。
スライシングが起こる例について知りたいです。
###知りたいこと
C++でスライシングが起こる例をプログラムで書いて頂きたいです
クラス名や変数名などのこだわりは無いです。どんなに簡単でも良いのでスライシングが起こる
プログラムを教えてください。
漠然としていますが宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
こんにちは。
スライシングは、[派生クラスのインスタンスを基底クラスのインスタンスへコピーする際に発生する意外な動作」を指すことが多いようです。
- 派生クラスにのみ存在するデータメンバの記憶領域は、基底クラスには当然存在しないのでコピーされません。
- 仮想関数テーブルは記憶領域が存在しますが、コピーされません。
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
投稿2017/12/16 04:20
総合スコア23272
0
こんなんでえぇのかの?
C++
1#include <iostream> 2 3class Base { 4public: 5 int value; 6 Base(int v) : value(v) {} 7}; 8 9class Derived : public Base { 10public: 11 int dummy; 12 Derived(int v=123) : Base(v) {} 13}; 14 15int main() { 16 Derived arr[10]; 17 Base* pb = arr; 18 for ( int i = 0; i < 10; ++i ) { 19 std::cout << pb->value << " "; 20 ++pb; 21 } 22}
投稿2017/12/16 02:57
総合スコア16614
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
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