C ++中的私有继承

时间:2013-09-08 09:13:19

标签: c++ inheritance private

我正在学习OOPS的概念,并遇到了私有继承。从我学到的东西 - 当实例化派生类时,类派生自基类和字母时,首先调用Base类的构造函数,然后调用派生类的构造函数。因此,在代码“A created”中将首先打印。 问题是因为继承是私有的,所以A的所有成员在B中都是私有的,所以如何在实例化B时调用A的构造函数。按照这个逻辑,下面的代码应该生成错误,但是当我运行它时,它编译得很好,并给出输出“A created”,然后是“B created”。 这是怎么回事?或者我在理解这个概念时犯了一些错误?

#include <iostream>
using namespace std;

class A{
public:
    A(void)
    {
        cout<<"A created"<<endl;
    }
    ~A()
    {
        //do nothing
    }
    void doSomething(void)
    {
        cout<<"hi";
    }
};    

class B:private A
{
    public:
    B(void)
    {
        cout<<"B created"<<endl;
    }
    ~B()
    {
        //do nothing
    }
};

int main() {
    B* myptr = new B();
    //myptr->doSomething();
    delete myptr;
    return 0;
}

3 个答案:

答案 0 :(得分:3)

B可以调用A的公共(和受保护)方法,因为构造函数是公共B可以调用它。

请参阅以下链接以更好地了解c ++私有继承: Difference between private, public, and protected inheritance

答案 1 :(得分:0)

继承的访问说明符限制对派生类外部代码的访问;认为基类A好像是一个普通的私人领域:“外面”看不到它,但B可以从“内部”自由地使用它。

对于构造函数,它由B的构造函数隐式调用,因此没有问题(此外,私有继承也将无法使用)。

尽管如此,不要过于担心私有继承,它在极少数情况下很有用(我似乎从未在现实生活中使用它,因此许多语言甚至不支持它),通常是组合(使用普通的私有字段)是一种更好,更简单的方法。

答案 2 :(得分:0)

这里是good short article about private inheritance,它详细说明了什么是私有继承,何时有用以及什么时候应该避免包含它。

简而言之:

  • 继承访问修饰符限制对基本类属性和方法的访问,不是对派生类的访问,而是对使用派生类的代码的访问。
  • 这对于继承类用户的“替换”(非“扩展”)基本类接口非常有用。
  • 一般来说,包含基本类成员而不是使用私有继承更好。
  • 如果你需要重用一些依赖虚函数的基类的方法,你需要覆盖虚函数(但你仍然希望隐藏部分基本类接口与外部代码),这是私有继承的更合适的情况

希望这会有所帮助。