我正在学习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;
}
答案 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,它详细说明了什么是私有继承,何时有用以及什么时候应该避免包含它。
简而言之:
希望这会有所帮助。