0

我正在学习 OOPS 的概念,并遇到了私有继承。从我所学到的——当一个类从基类派生时,当派生类被实例化时,首先调用基类的构造函数,然后是派生类的构造函数。因此,将首先打印代码中的“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;
}
4

3 回答 3

3

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

请参阅以下链接以更好地理解 c++ 私有继承: 私有、公共和受保护继承之间的区别

于 2013-09-08T09:23:06.253 回答
0

这是一篇关于私有继承的好短文,它详细说明了什么是私有继承,什么时候有用,什么时候应该避免它以支持包含。

简而言之:

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

希望这会有所帮助。

于 2013-09-08T13:56:24.683 回答
0

继承的访问说明符限制对派生类之外的代码的访问;把基类 A 想成是一个普通的私有域:“外面”看不到它,但 B 可以从“里面”自由地使用它。

至于构造函数,它是由B的构造函数隐式调用的,所以没有问题(而且,否则私有继承将无法使用)。

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

于 2013-09-08T09:36:07.557 回答