将派生对象赋值给基类对象而不使用对象切片
Assigning a derived object to a base class object without object slicing
如何将派生对象分配给基类的静态类型而没有堆分配?
基本上,我想知道这是否可能:
Base* b = new Derived;
你不能在没有切片的情况下将Derived
对象分配给Base
变量- Base
变量只是不够"大"来容纳Derived
类型的对象。可以这样想,您仍然需要sizeof(Derived)
字节的内存来保存一个实际的对象。
但是,您可以避免堆分配。
将其分配为自动变量:
Derived d;
Base* b = &d;
或者作为静态变量:
static Derived d;
Base* b = &d;
或者全局:
//Somewhere in global scope
Derived d;
//...somewhere in function
Base* b = &d;
或者甚至在预分配的内存上放置new (免责声明:不要使用这个实际代码):
static char memory[sizeof(Derived)];
Base* b = new(memory)Derived;
最后,原始指针可以通过引用来避免,但是在初始化之后就失去了修改它的能力:
Derived d;
Base& b = d;
无论哪种方式,您都必须为Derived
对象分配足够的空间,并且必须确保它存活足够长的时间,因此在原始Derived
被销毁后,您不会访问Base
对象。
相关文章:
- 避免矢量中的对象切片<Base><shared_ptr>
- 专门化模板覆盖函数/避免对象切片
- C++ 被此代码与多态性、指针和对象切片混淆
- 我们能胜过对象切片吗?
- 如何在考虑对象切片的同时通过传入单个 Base 对象来打印出数组中的对象?
- 成员变量和对象切片
- 如何在不引入未来对象切片的情况下实现 ICloneable
- 避免对象切片
- 故意对对象切片是一种可行的技术吗?
- 对象切片:通过按值派生为 Base - 安全还是危险?
- C++ CRTP 派生类对象切片
- C++ - 即使在使用指针后也能进行对象切片
- 了解对象切片
- 使用对象切片可靠地从多个基类之一中复制
- 对象切片和隐式类型转换
- 一种克服对象切片的方法
- 按引用传递可避免对象切片
- 使用CRTP时的对象切片
- 对象切片:从基类对象访问分层的类方法
- 这会导致对象切片吗?