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

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。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值