【问题标题】:Assigning a derived object to a base class object without object slicing将派生对象分配给基类对象而不进行对象切片
【发布时间】:2015-11-07 06:10:07
【问题描述】:

如何在不分配堆的情况下将派生对象分配给静态类型的基类?

基本上,我想知道这是否可能:

Base* b = new Derived;

但没有新的和原始的指针。

【问题讨论】:

  • Base&& b = Derived{}; 会起作用,尽管它确实让我想知道你为什么首先需要它。

标签: c++ inheritance virtual-inheritance


【解决方案1】:

如果不进行切片,您不能将 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;

甚至在预分配内存上使用placement new免责声明:不要使用这个实际代码):

static char memory[sizeof(Derived)];
Base* b = new(memory)Derived;

最后,原始指针可以通过引用来避免,但是在初始化之后你就失去了改变它的能力:

Derived d;
Base& b = d;

无论哪种方式,您都必须为Derived对象分配足够的空间,并且您必须确保它存在足够长的时间,这样您就不会在原始Derived被销毁后访问您的Base对象。

【讨论】:

  • 别忘了对齐问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2016-08-20
  • 2014-08-13
  • 2012-01-13
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多