オブジェクトのスライシング
をテンプレートにして作成
Check
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[ssacontents]]
C++において、オブジェクトのスライシングとは、
class base {
int a;
virtual const char* name() { return "base"; }
};
class sub : public base {
int b;
virtual const char* name() { return "sub"; }
};
void hoge(base& b) {
printf("%s\n", b.name());
base tmp = b;
printf("%s\n", tmp.name());
}
sub s;
hoge(s);
...
hoge()では、"sub","base"が表示される。~
文法的には正しいので、警告はでない。このミスを見つけるの...
これを未然に防ぐには、工数がかかるけど以下のようにする。
class base {
int a;
base() : a(0) {}
base(const base& b) : a(b.a) {}
virtual ~base() {}
virtual const char* name() { return "base"; }
virtual base* clone() { return new base(*this); }
static void destroy(base* b) { delete b; }
private:
void operator = (const base&);
};
class sub : public base {
int b;
sub() : b(0) {}
sub(const sub& s) : base(s), b(s.b) {}
virtual ~sub() {}
virtual const char* name() { return "sub"; }
virtual base* clone() { return new sub(*this); }
};
void hoge(base& b) {
printf("%s\n", b.name());
base* tmp = b->clone(); // base tmp = b;ではビルドエ...
printf("%s\n", tmp->name());
base::destroy(tmp); // baseとしてdeleteされるので仮...
}
sub s;
hoge(s);
...
hoge()では、"sub","sub"が表示される。~
終了行:
[[ssacontents]]
C++において、オブジェクトのスライシングとは、
class base {
int a;
virtual const char* name() { return "base"; }
};
class sub : public base {
int b;
virtual const char* name() { return "sub"; }
};
void hoge(base& b) {
printf("%s\n", b.name());
base tmp = b;
printf("%s\n", tmp.name());
}
sub s;
hoge(s);
...
hoge()では、"sub","base"が表示される。~
文法的には正しいので、警告はでない。このミスを見つけるの...
これを未然に防ぐには、工数がかかるけど以下のようにする。
class base {
int a;
base() : a(0) {}
base(const base& b) : a(b.a) {}
virtual ~base() {}
virtual const char* name() { return "base"; }
virtual base* clone() { return new base(*this); }
static void destroy(base* b) { delete b; }
private:
void operator = (const base&);
};
class sub : public base {
int b;
sub() : b(0) {}
sub(const sub& s) : base(s), b(s.b) {}
virtual ~sub() {}
virtual const char* name() { return "sub"; }
virtual base* clone() { return new sub(*this); }
};
void hoge(base& b) {
printf("%s\n", b.name());
base* tmp = b->clone(); // base tmp = b;ではビルドエ...
printf("%s\n", tmp->name());
base::destroy(tmp); // baseとしてdeleteされるので仮...
}
sub s;
hoge(s);
...
hoge()では、"sub","sub"が表示される。~
ページ名: