私有继承中的对象切片

Bhu*_*ant 1 c++ private-inheritance object-slicing

为什么私有继承中不会发生对象切片?Static_cast 在这种情况下会出错? \n我知道私有继承不保留 \xe2\x80\x9cis - 其继承类之间的 \xe2\x80\x9d 关系。这是否与切片有关,因为派生不是基类型,因此编译器强制不进行隐式转换?

\n

the*_*amb 5

将派生类切片为其私有基类没有任何意义。请考虑一下“私人”的含义。这意味着外界不应该关心此事。允许切片(铸造)到私人基地意味着外界会关心。

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

class Base { };
struct Derived : private Base 
{
    Base asBase() { return static_cast<Base>(*this); }
};
Run Code Online (Sandbox Code Playgroud)

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

  • 我没有展示如何获取 Base _pointer_。'asBase' 函数将 Derived 对象切片为 Base(请注意,asBase 的返回值是 'Base',而不是 'Base*' 或 'Base&amp;',这两者都不会切片对象)。重点是切片不能在 Derived 范围之外完成,因为 Base 是私有基。这就是为什么您“需要”在 Derived 范围内进行切片的原因。希望这能澄清事情。 (2认同)