【发布时间】:2012-03-01 09:18:16
【问题描述】:
这是一个大得多的代码的缩小问题。我知道 C.a 应该在堆上,但我想避免更改“。”在代码中的任何地方都使用“->”。有没有办法可以绕过这个错误? (编译器为 g++ 4.6.1) 我认为这是一个错误,因为 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,这在课堂上是行不通的。 AA *_a;AA &a = *_a;现在 _a 需要为 const。
-
@chuu79: 为什么这行不通?是的,
_a不能指向不同的内存位置,但可以在该位置创建一个新对象。另一方面,改变类型仍然是非法的。上周刚刚回答了一个关于该问题的问题。 -
哇,谢谢,这实际上可以解决我的问题!
标签: c++ inheritance stack virtual new-operator