C++继承在堆栈上不起作用
C++ inheritance not working on stack?
这是一个大得多的代码的缩小问题。我知道 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;
};
唯一的错误是你的代码。 您正在调用未定义的行为(实际上以几种不同的方式(。
该标准不需要对此进行诊断,编译器没有责任确保您不会做任何愚蠢的事情。
new (&a) AB(); // everything works here except virtuals
这实际上不起作用:这里的行为是未定义的。 a
是类型 AA
的对象。 不能在其位置构造 AB
类型的对象。 唯一允许你在那里构造的对象是AA
对象。
如果需要a
的多态行为,则应使用指向动态分配对象的指针。 优选地,智能指针指向动态分配的对象,例如,std::unique_ptr<AA>
。 另请注意,AA
应该有一个虚拟析构函数。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 双链表堆栈删除函数不起作用
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- C++堆栈实现弹出函数不起作用
- 交换堆栈的 2 个值不起作用
- 二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用
- C++继承在堆栈上不起作用
- 具有推送和弹出功能的堆栈不起作用
- 如何在Qt中增加线程的堆栈大小- QThread::setStackSize()似乎不起作用