【问题标题】:Object slicing in private inheritance私有继承中的对象切片
【发布时间】:2013-09-29 07:22:20
【问题描述】:

为什么对象切片不会发生在私有继承中? Static_cast 在这种情况下会出错吗? 我知道私有继承在其继承类之间不保持“is - a”关系。这是否与切片有关,因为 derived 不是 base 类型,所以编译器强制不进行隐式转换?

【问题讨论】:

  • 显示一些代码。将派生类型的对象转换为基类型的对象会对该对象进行切片。这就是切片的意思。

标签: c++ object-slicing private-inheritance


【解决方案1】:

将派生类切分到其私有基类没有任何意义。想一想“私人”是什么意思。这意味着外界不应该关心它。允许对私人基地进行切片(铸造)意味着外界会关心。

如果你真的想要这种行为(我很想听听你的理由),你可以绕过它:

class Base { };
struct Derived : private Base 
{
    Base asBase() { return static_cast<Base>(*this); }
};

这样,转换发生在 Derived 内部,Base 可以访问。您从 static_cast 得到的错误是因为它在 Derived 范围之外使用,其中 Base 不可访问。

【讨论】:

  • 我想我明白你想说什么...还有一件事,感谢您展示获取基本指针的方法,但真的需要吗?
  • 我没有展示如何获取基本 指针。 'asBase' 函数将 Derived 对象切片为 Base(请注意,asBase 的返回值是 'Base',而不是 'Base*' 或 'Base&',它们都不会对对象进行切片)。关键是不能从 Derived 范围之外进行切片,因为 Base 是一个私有基础。这就是为什么您“需要”在 Derived 范围内进行切片。希望这可以澄清事情。
猜你喜欢
  • 1970-01-01
  • 2020-10-25
  • 2018-05-11
  • 2020-04-06
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2021-03-29
  • 2011-05-30
相关资源
最近更新 更多