私人继承

时间:2009-10-16 09:04:04

标签: c++ inheritance

我不完全理解这一点:

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(),这实际上是在派生对象上完成的吗?或者还有其他原因吗?

6 个答案:

答案 0 :(得分:18)

从对继承的共同理解来看,C ++的“私有继承”是一个可怕的误称:它是不是继承(就类的所有内容而言)而是一个完整的实现细节上课。

从外部看,私人继承实际上与构成完全相同。只有在类的内部才能获得特殊的语法,这种语法更像是继承而不是组合。

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

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

毋庸置疑,这是邪恶

答案 1 :(得分:18)

公共继承意味着每个人都知道Derived派生自Base。

受保护的继承意味着只有Derived,Derived的朋友和派生自Derived的类知道Derived是从Base派生的。*

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

由于你使用了私有继承,你的main()函数对于从base的派生没有任何线索,因此无法分配指针。

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

*还有:土拨鼠砍了多少木头......

答案 2 :(得分:9)

因为private表示“实现细节”,这使得DerivedBase派生出一个实现细节。

私有继承不是接口继承,而是实现继承。它不实现“Is-A”关系,而是实现“Is-Implemented-Using”关系。就类的用户而言,Derived不是Base,它恰好(目前)使用它来实现。

答案 3 :(得分:1)

如果您私下继承任何需要从Derived *转换为Base *的代码必须是Derived类的成员或朋友。

答案 4 :(得分:1)

答案 5 :(得分:0)

使用私有继承,您将失去将派生对象视为基类对象的选项。