【问题标题】:Why does slicing occur exactly?为什么切片会准确发生?
【发布时间】:2014-06-27 21:04:07
【问题描述】:

我知道当我们将超类分配给子类时,切片会切断对象的其他子类特定部分,如下所示:

Sub mySub;
Super mySuper = &mySub;
// mySuper DOESN'T contain any sub class behaviour

如果我们这样做了:

Sub mySub;
Super& mySuper = &mySub;
// mySuper DOES contain the sub class behaviour

但我不明白为什么引用有效以及为什么对象无效。

我已经看到原因是因为没有引用需要复制对象 - 但我仍然不明白为什么这会导致切片?

我也不明白为什么这个参考有效。我们将 Super 引用指向 Sub 对象的开头,但编译器知道超级对象应该有多大,所以我不希望将内存关联到 Super 部分之外(对应于对象的子类组件)到超级参考?

【问题讨论】:

  • 切片复制的副作用。创建引用不会复制对象。
  • &mySub ...那里有错字吗?这是一个地址。
  • “我们将 Super 引用指向 Sub 对象的开头”——这不是真的! (即使我用指针替换引用)指针指向Sub 对象中包含的Super 对象的开头。使用多重继承时有一个巨大的区别:指针的值将取决于你转换对象的基类!
  • "What is the Slicing Problem inC++",(本页最上面的相关文章)是否不足以描述导致切片的原因?

标签: c++ inheritance polymorphism virtual object-slicing


【解决方案1】:
Super mySuper = mySub;

在这种情况下,将实例化一个新对象并调用复制构造函数。新对象不包含任何额外内容是合理的。

Super& mySuper = mySub;

在这种情况下,您设置了对对象的引用。引用就像一个指针,它不知道对象有多大。只有它引用了什么样的对象以及它在内存中的位置。根据从mySuper 的地址派生的类,“Sub”可能与mySub 的地址不同。您可以通过使用指针并打印它们的值来轻松地尝试一下。 虽然引用本身只知道对象的“超级”部分的位置,但您可以回退;编译器知道在哪里可以找到“Sub”对象的其余部分(如果它确实是一个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2013-07-22
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多