2013-09-29 47 views
1

为什么对象切片不发生在私有继承中?在这种情况下,Static_cast会产生错误? 我明白,私有继承不会在其继承类之间保持“是 - 一种”关系。这是否与切片有关,因为派生不是基类型的,因此编译器强制不进行隐式转换?私有继承中的对象切片

+0

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

回答

3

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

如果你真的想这样的行为(我很想听听你的理由),你可以破解它周围:

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

这样,投偏偏内源性,在基地进行访问。您从static_cast获得的错误是因为它在Derived的范围之外使用,其中Base无法访问。

+0

我想我明白你想说什么......还有一件事,谢谢你展示了获得基指针的方式,但它真的需要吗? –

+1

我没有展示如何获得Base _pointer_。 'asBase'函数将Derived对象分割为一个Base(注意,asBase的返回值是'Base',而不是'Base *'或'Base&',它们都不会分割对象)。总的来说,切片不能从Derived的范围之外完成,因为Base是一个私有基础。这就是为什么你需要在Derived范围内发生切片。希望这可以澄清事情。 – thelamb

+0

好的..现在我明白了你的观点,谢谢... –