スタック上にあることは、割り当てと自動解放の点で有利かもしれませんが、いくつかの不利な点があります。
スタックに巨大なオブジェクトを割り当てたくない場合があります。
ダイナミック出動!次のコードを検討してください。
#include <iostream>
class A {
public:
virtual void f();
virtual ~A() {}
};
class B : public A {
public:
virtual void f();
};
void A::f() {cout << "A";}
void B::f() {cout << "B";}
int main(void) {
A *a = new B();
a->f();
delete a;
return 0;
}
これにより、「B」が出力されます。Stack を使用するとどうなるか見てみましょう。
int main(void) {
A a = B();
a.f();
return 0;
}
これは「A」を出力しますが、Java やその他のオブジェクト指向言語に精通している人には直感的ではないかもしれません。その理由は、インスタンスへのポインタがもうないからB
です。代わりに、 のインスタンスが作成され、 type の変数にB
コピーされます。a
A
特に C++ を初めて使用する場合は、直感に反して発生することがあります。C では、ポインターがあり、それだけです。あなたはそれらの使い方を知っていて、いつも同じことをします。C++ では、そうではありません。この例で a をメソッドの引数として使用するとどうなるか想像してみてください - 物事はより複雑になり、a
isA
または or A*
or even A&
(call-by-reference) の場合に大きな違いが生じます。多くの組み合わせが可能であり、それらはすべて異なる動作をします。