これははるかに大きなコードのダウンサイズの問題です。私はC.aがヒープ上になければならないことを知っていますが、私は変更を避けたい " " - >"をコード内のどこにでも置くことができます。このバグを回避できる方法はありますか?私はこのことを可能にするが、適切に動作しませんC++以来のバグを検討 ...C++の継承はスタック上で動作していませんか?
#include <iostream>
using namespace std;
class AA {
public:
virtual void foo() {
cout << "AA!\n";
};
};
class AB : public AA {
public:
AB() : AA() { cout << "construct AB!\n"; }
void foo() {
cout << "AB!\n";
}
};
class C {
public:
AA a;
void xchg() {
a.~AA();
new (&a) AB(); // everything works here except virtuals
}
};
int main() {
C c;
c.a.foo(); // -> AA
c.xchg();
c.a.foo(); // -> AA :(
AA *aa = new AB();
aa->foo(); // -> AB (virtual works)
return 0;
};
ご希望の場合は、使用するだけです。代わりに - >なぜ単に参照を使用していないのですか?ヒープ上にオブジェクトを作成し、それを使用したいときはローカル参照に割り当てます。 – Nerdtron
Nerdtron、これはクラスでは動作しません。 AA * _a; AA&a = * _a; 今_aはconstである必要があります。 – chhu79
@ chuu79:なぜうまくいかないのですか?はい、 '_a'は別のメモリ位置を指すことはできませんが、その場所に新しいオブジェクトを作成することができます。一方、タイプを変更することはまだ違法です。先週の質問にちょうど答えました。 –