首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私有继承

私有继承
EN

Stack Overflow用户
提问于 2009-10-16 09:04:04
回答 6查看 5.2K关注 0票数 8

我不完全理解这一点:

代码语言:javascript
复制
class Base
{
    public:
    Base()
    {
        cout<<"Base" << endl;
    }

    virtual void call()
    {
        cout<<"Base call" << endl; 
    }
};

class Derived: private Base
{
    public:      
    Derived()
    {
        cout<<"Derived" << endl;
    } 
};

int main(void)
{
    Base *bPtr = new Derived(); // This is not allowed
}

是否因为有人可能会使用bPtr调用call(),而这实际上是在派生对象上完成的?或者还有其他原因吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-16 09:11:14

从对继承的普遍理解来看,C++的“私有继承”是一个可怕的用词不当:它不是继承(就类之外的一切而言),而是类的完整实现细节。

从外部看,私有继承实际上与组合几乎相同。只有在类的内部,你才能得到特殊的语法,这种语法更像是继承而不是组合。

但有一个警告: C++在语法上将其视为继承,并具有由此带来的所有好处和问题,例如scope visibility and accessibility。此外,C风格的强制转换(但没有C++强制转换!)实际上忽略了可见性,因此成功地将Derived指针强制转换为Base

代码语言:javascript
复制
Base* bPtr = (Base*) new Derived();

不用说,这是邪恶的

票数 23
EN

Stack Overflow用户

发布于 2009-10-16 10:27:39

公共继承意味着每个人都知道派生是从Base派生的。

受保护的继承意味着只有派生的、派生的朋友和派生的类知道派生是从基础派生的。*

私有继承意味着只有派生的和派生的朋友知道派生是从Base派生的。

因为你已经使用了私有继承,你的main()函数不知道从base派生,因此不能赋值指针。

私有继承通常用于实现“is -implemented-in-terms of”关系。一个例子可能是Base公开了一个您需要覆盖的虚函数--因此必须继承自它--但是您不想让客户端知道您有这种继承关系。

*还有:一只土拨鼠能扔多少木头...

票数 24
EN

Stack Overflow用户

发布于 2009-10-16 10:16:53

因为private的意思是“实现细节”,这使得Derived派生自Base这一事实成为实现细节。

私有继承不是接口继承,而是实现继承。它不实现"Is-A“关系,而是"Is-Implemented-Using”关系。对于类的用户而言,Derived不是Base,它只是碰巧(目前)使用它实现的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1576978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档