欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++的公有、保护、私有继承派生

程序员文章站 2022-03-08 20:16:58
...

C++类的成员分为三种属性分别是公有、保护、私有。三种属性控制着成员的访问控制权限。

首先讲公有成员。公有成员是其类对外部的接口,任何外部函数都可以访问公有数据或者函数。

其次是保护成员。保护成员是非派生类的外部函数无法访问保护数据或者函数,对于此类下的派生类可以访问到此类的保护数据或者函数。

最后将私有成员。私有成员只能是类内的函数访问到其私有数据或者函数。

我之所以把它们按照这样的顺序讲述,是因为我感觉它们有着控制权限递增的趋势。控制力度是私有>保护>公有。

上述规则在任何基类以及派生类都是适用的。

下面讲述公有、保护、私有继承派生。

公有继承:基类中的成员在派生类中的属性都不变,基类的私有成员在派生类中无法访问,基类的保护成员在派生类外其他函数无法访问,基类的共有成员仍是派生类的接口,均可访问。

保护继承:基类中的公有成员以及保护成员在派生类中的属性均为保护成员,即只能在类以及派生类中访问,其他外部函数无法访问。基类的私有成员在派生类中依旧无法访问。

私有继承:基类中的公有成员以及保护成员在派生类中的属性均为私有成员,即只能在类中访问,其他外部函数以及派生类中均午饭访问。基类的私有成员也无法在派生类中访问。

下面在VS下采用代码的形式深入的理解一下三种属性以及三种继承的含义。

对基类A三种属性成员的访问。

#include<iostream>

//基类A
class A{

public:

	A() :Anum_pub(0), Anum_pro(0), Anum_pri(0){};//construtor

	A(int b, int o, int i) :Anum_pub(b), Anum_pro(o), Anum_pri(i){};//construtor with 

	void fun(){
		std::cout << "Anum_pub: " << Anum_pub << std::endl;
		std::cout << "Anum_pro: " << Anum_pro << std::endl;
		std::cout << "Anum_pri: " << Anum_pri << std::endl;
	}

public:
	int Anum_pub;
protected:
	int Anum_pro;
private:
	int Anum_pri;

};


void main(){

	A a(1,2,3);

	a.fun();

	std::cout << "a.Anum_pub: " << a.Anum_pub << std::endl;
	//std::cout << "a.Anum_pro: " << a.Anum_pro << std::endl;//错误,保护成员外部无法访问
	//std::cout << "a.Anum_pri: " << a.Anum_pri << std::endl;//错误,私有成员外部无法访问
	system("pause");
}

保护成员以及私有成员在外部就无法访问

派生类B公有继承基类A

#include<iostream>

//基类A
class A{

public:

	A() :Anum_pub(0), Anum_pro(0), Anum_pri(0){};//construtor

	A(int b, int o, int i) :Anum_pub(b), Anum_pro(o), Anum_pri(i){};//construtor with 

	void fun(){
		std::cout << "Anum_pub: "<<Anum_pub << std::endl;
		std::cout << "Anum_pro: " << Anum_pro << std::endl;
		std::cout << "Anum_pri: " << Anum_pri << std::endl;
	}

public:
	int Anum_pub;
protected:
	int Anum_pro;
private:
	int Anum_pri;

};

class B :public A{
public:

	B(){};

	B(int b, int o, int i, int bb) :A(b, o, i), Anum_pub(bb){};

	void funb(){
		std::cout << "A::Anum_pub:" << A::Anum_pub << std::endl;
		std::cout << "Anum_pub:" << Anum_pub << std::endl;
		std::cout << "Anum_pro:" << Anum_pro << std::endl;
		//std::cout << "Anum_pri" << Anum_pri << std::endl;//错误,基类私有成员无法访问
	}

public:
	int Anum_pub;
};


void main(){
	
	B b(1, 2, 3,4);

	b.fun();
	b.funb();

	std::cout << "b:A.num_pub:" << b.A::Anum_pub << std::endl;
	std::cout << "b.Anum_pub: " << b.Anum_pub << std::endl;
	//std::cout << "b.Anum_pro: " << b.Anum_pro << std::endl;//错误,派生类保护成员无法访问
	//std::cout << "b.Anum_pri: " << b.Anum_pri << std::endl;//错误,派生类的私有成员无法访问


	system("pause");
}

运行可以看到,公有继承下,派生类外保护成员私有成员无法访问,派生类内无法访问基类私有成员。

派生类B保护继承基类A

#include<iostream>

//基类A
class A{

public:

	A() :Anum_pub(0), Anum_pro(0), Anum_pri(0){};//construtor

	A(int b, int o, int i) :Anum_pub(b), Anum_pro(o), Anum_pri(i){};//construtor with 

	void fun(){
		std::cout << "Anum_pub: "<<Anum_pub << std::endl;
		std::cout << "Anum_pro: " << Anum_pro << std::endl;
		std::cout << "Anum_pri: " << Anum_pri << std::endl;
	}

public:
	int Anum_pub;
protected:
	int Anum_pro;
private:
	int Anum_pri;

};

class B :protected A{
public:

	B(){};

	B(int b, int o, int i, int bb) :A(b, o, i), Anum_pub(bb){};

	void funb(){
		std::cout << "A::Anum_pub:" << A::Anum_pub << std::endl;
		std::cout << "Anum_pub:" << Anum_pub << std::endl;
		std::cout << "Anum_pro:" << Anum_pro << std::endl;
		//std::cout << "Anum_pri" << Anum_pri << std::endl;//错误,基类私有成员无法访问
	}

public:
	int Anum_pub;
};


void main(){
	
	B b(1, 2, 3,4);

	//b.fun();派生类的保护成员无法访问
	b.funb();

	//std::cout << "b:A.num_pub:" << b.A::Anum_pub << std::endl;//错误,派生类保护成员无法访问
	std::cout << "b.Anum_pub: " << b.Anum_pub << std::endl;
	//std::cout << "b.Anum_pro: " << b.Anum_pro << std::endl;//错误,派生类保护成员无法访问
	//std::cout << "b.Anum_pri: " << b.Anum_pri << std::endl;//错误,派生类的私有成员无法访问


	system("pause");
}

运行可以看到,保护继承下,基类的公有成员在派生类下变为了保护成员无法访问。

派生类B私有继承基类A

#include<iostream>

//基类A
class A{

public:

	A() :Anum_pub(0), Anum_pro(0), Anum_pri(0){};//construtor

	A(int b, int o, int i) :Anum_pub(b), Anum_pro(o), Anum_pri(i){};//construtor with 

	void fun(){
		std::cout << "Anum_pub: "<<Anum_pub << std::endl;
		std::cout << "Anum_pro: " << Anum_pro << std::endl;
		std::cout << "Anum_pri: " << Anum_pri << std::endl;
	}

public:
	int Anum_pub;
protected:
	int Anum_pro;
private:
	int Anum_pri;

};

class B :private A{
public:

	B(){};

	B(int b, int o, int i, int bb) :A(b, o, i), Anum_pub(bb){};

	void funb(){
		std::cout << "A::Anum_pub:" << A::Anum_pub << std::endl;
		std::cout << "Anum_pub:" << Anum_pub << std::endl;
		std::cout << "Anum_pro:" << Anum_pro << std::endl;
		//std::cout << "Anum_pri" << Anum_pri << std::endl;//错误,基类私有成员无法访问
	}

public:
	int Anum_pub;
};


void main(){
	
	B b(1, 2, 3,4);

	//b.fun();派生类的私有成员无法访问
	b.funb();

	//std::cout << "b:A.num_pub:" << b.A::Anum_pub << std::endl;//错误,派生类私有成员无法访问
	std::cout << "b.Anum_pub: " << b.Anum_pub << std::endl;
	//std::cout << "b.Anum_pro: " << b.Anum_pro << std::endl;//错误,派生类私有成员无法访问
	//std::cout << "b.Anum_pri: " << b.Anum_pri << std::endl;//错误,派生类的私有成员无法访问


	system("pause");
}

从结果上来看私有继承与上面的保护继承没有太大变化,但是如果在派生类B的派生类C中,派生类C的中将无法访问到A:Anum_pub,Anum_pro以及Anum_pri。