C++ 私人继承

C++ 私人继承,c++,inheritance,C++,Inheritance,我不完全理解这一点: class Base { public: Base() { cout<<"Base" << endl; } virtual void call() { cout<<"Base call" << endl; } }; class Derived: private Base { public: Derived(

我不完全理解这一点:

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
}
类基
{
公众:
Base()
{

CUT

私有继承,你失去了将你的派生对象当作你的基类对象的选项。

< P>从继承的共同理解中,C++“私有继承”是一个可怕的误称:它不是继承(就涉及到类外的一切)。而是类的完整实现细节

从外部看,私有继承实际上与组合非常相似。只有在类的内部,你才能得到比组合更让人想起继承的特殊语法

<> P> >有一个警告:C++将此视为继承,包含所有的好处和问题,例如,此外,C样式的转换(但没有C++的Casic!)实际上忽略了可见性,从而成功地将您的<代码>派生指针指向<代码> BASE<代码>:

Base* bPtr = (Base*) new Derived();

不用说,如果您私下继承任何需要从派生类*转换为基类*的代码,则必须是派生类的成员或朋友,这就是罪恶。

因为
private
表示“实现细节”,这使得
派生的
派生自
基础
这一事实成为一个实现细节


私有继承不是接口继承,而是实现继承。它不实现“is-A”关系,而是“is-Implemented Using”关系。
派生的
不是
就类的用户而言,它只是碰巧发生在(当前)公共继承意味着每个人都知道派生自Base

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

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

由于您使用了私有继承,因此main()函数没有关于从基派生的线索,因此无法分配指针

私有继承通常用于实现“按条件实现”关系。一个示例可能是,Base公开了一个需要重写的虚拟函数,因此必须从中继承,但您不希望客户端知道您具有该继承关系


*还有:一只土拨鼠会扔掉多少木头…

这是实现继承,而不是接口继承。@劳伦斯:是的,但这只是术语上的争论。我关心的是类的外部视图。“这不是继承”绝对错误。这是继承,具有私有访问权。@curiousguy(我甚至不知道我为什么要费心)看看我对劳伦斯评论的回答。此外,我知道这是一种简化(即使在类之外的C样式转换也可以在私有继承层次结构中转换)。但这是一种关于私有继承的有用(在我看来是最有用的)直觉。@KonradRudolph“即使在类之外,C风格的强制转换也可以在私有继承层次结构中强制转换”,这一点我一点也不担心。任何使用强制转换的人都应该知道自己在做什么,并承担全部责任。而使用C强制转换而不是杰出强制转换的人更应该知道自己在做什么。(真正想绕过类型系统或访问控制的人可能无论如何都会这么做,即使这意味着要做非常肮脏的事情。)谢谢你的回答,但我真的想知道他们为什么不允许这种情况发生。@nitinsoman,因为你写了
private
。这就是私密访问的意思……你的问题是什么?三年半后,用这么一句话做了精彩的解释,并补充了我的答案:在私密继承的情况下,不是吗甚至连Base都不知道派生的是从Base派生的。也就是说,如果派生的私有继承自Base,则Base的成员函数中的
dynamic_cast(this)
将始终返回NULL。我提到这一点是因为最近在尝试通过奇怪的递归模板模式传入的类的私有继承时,它咬了我一口。