cppTest-8.1:三种派生方式和单基&多基派生

本文详细解析了C++中派生类的三种权限等级:private、protected和public,以及它们如何影响基类成员的访问权限。通过实例展示了如何在派生类中访问和修改这些权限级别的成员,并探讨了单基派生与多基派生的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *cppTest-8.1:三种派生方式和单基&多基派生
 *
   @@可理解级别为:private<protected<public(比Java少了default!)
  派生方式:private全变私有;protected降级;public保持级别。(派生不能提升权限!)
private派生方式:
	基类        派生类
	private     不可见
	protected   private
	public      private

 protected派生方式:
	基类        派生类
	private     不可见
	protected   private
	public      protected

public派生方式:
	基类        派生类
	private     不可见
	protected   protected
	public      public
	
 *author 炜sama
 */
#include<iostream.h>
#include<string.h>
class F{
public:
	int pubi;
};
class Father{		
private:
	int prii;
protected:
	int proi;
public:
	int pubi;
	Father(int prii2,int proi2,int pubi2){	    		
		prii=prii2;
		proi=proi2; 
		pubi=pubi2;
}
void show()
{
	cout<<"prii:"<<prii<<endl;
	cout<<"proi:"<<proi<<endl;
	cout<<"pubi:"<<pubi<<endl;
}
};

//各种单基派生示例:
class C1:public Father{//public派生会保持父类成员的访问权限的等级~
	//int prii;//可以再定义父类的属性!
	//定义各种子类的成员...
	int i;
public:
	//构造函数后面必须带上:Father(nm,ag,sx)以初始化父类!去掉后编译会出错~所以定义一个本类变量时会先调用父类的构造函数再调用本类的构造函数~
	C1(int prii2,int proi2,int pubi2,int i2):Father(prii2,proi2,pubi2){	    
		i=i2;
	}
	//重写父类方法
	void show()	{
		Father::show();//以这样的形式来直接访问父类成员!Java的话则是:super.show();
		cout<<"i:"<<i<<endl;
	}
};

class C2:protected Father{//protected派生会把父类成员的访问权限降级,public》protected,protected》private,private不变,因为它最低级~
public:
	C2(int prii2,int proi2,int pubi2):Father(prii2,proi2,pubi2){	    
		show();//父类的show函数在这里降级成了protected级的,但是在本类里还可以访问~
	}
};
class C3:private Father{//private派生会把父类成员的访问权限全变私有!
public:
	C3(int prii2,int proi2,int pubi2):Father(prii2,proi2,pubi2){	    
		show();//父类的show函数在这里变成了private级的,但是在本类里还可以访问~
	}
};

//多基派生:
class Cs:public F,public Father{
public:
	void test(){
		//继承的多个父类中如果有相同的成员不会出错,不过一旦访问该成员时就会出错:引用不明!(与Java多继承接口情况相同)
		//cout<<pubi<<endl;//错误!
		cout<<F::pubi<<endl;//正确!指明引用的是F的成员
	}
};

void main(){    
	C1 c1(1,2,3,4);
	//c1.Father::show();//同上,子类对象访问父类成员
	c1.show();
	//cout<<c1.prii<<endl;//错误!在类之外不能访问类里的private成员!
	//cout<<c1.proi<<endl;//错误!在类之外不能访问类里的protected成员!与Java不同,Java的main方法在类里,所以可以访问静态的protected成员~
	cout<<c1.pubi<<endl;//正确!C1为public派生,继承父类的public成员在子类里还是public成员,在类之外可以访问!

	C2 c2(1,2,3);
	//cout<<c2.pubi<<endl;//错误!pubi被protected派生降级为了protected级别,在这里无法方法了~
	//c2.show();//错误!同上

	C3 c3(1,2,3);
	//cout<<c3.pubi<<endl;//错误!pubi被private派生降级为了private级别,在这里无法方法了~
	//c3.show();//错误!同上
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值