我使用private继承了一个构造函数,为什么我仍然可以从主函数访问它

I Inherited a constructor using private, Why am I still be able to access it from main function?

本文关键字:为什么 访问 函数 构造函数 继承 private 一个      更新时间:2023-10-16
#include <iostream>
using namespace std;
class base{
public:
    int i;
    base(){
    i=1;
    cout<<"Base Constructor";
    }
};
class derived: private base{
    public:
    derived(){
    i=2;
    cout<<"Derived constructor";
    }
};

int main(){ 
derived c;
return 0;
}

对于上面的代码,为什么我得到的输出"基本构造函数派生构造函数"即使我继承了使用private?

为什么我仍然可以从主功能访问它?

你不是。

您的主函数访问derived的构造函数,它可以访问该构造函数。

并且derived的构造函数访问base的构造函数,可以访问该构造函数。

构造函数在执行构造函数主体之前自动初始化基类和成员。私人继承并不能改变这一点。它只是使类的基本部分在类之外不可访问。由于是派生类构造函数调用基类构造函数,所以私有继承不会限制它的功能

您的意思是生成基类protected的构造函数。那么只有派生类才能使用它:

class base
{
protected:
    base() : i(1) { }
private:
    int i;
};
class derived : private base
{
public:
    derived() : base() { }
};
int main()
{ 
    // base b;  // error: inaccessible constructor base::base()
    derived d;  // fine
}

还有一种流行的模式是使析构函数受到保护。不过你明白了。