C++类的继承与派生(二)

<1>派生类成员的标识符和访问:派生类中的成员访问属性有如下四种

第一,不可访问成员:从基类私有成员继承而来,派生类本身和派生类对象无权访问,继续继承的新类也无权访问。

第二,私有成员:从基类的成员继承而来和新增成员,派生类内部可以访问,建立的对象无权访问,在继续继承的派生类变成不可访问成员。

第三,保护成员:从基类的成员继承而来和新增成员,派生类内部可以访问,建立的对象无权访问,在继续集成的派生类中变成私有成员或者保护成员。

第四,公有成员:从基类的成员继承而来和新增成员,派生类内部可以访问,建立的对象可以访问,在继续集成的派生类中变成私有成员,保护成员或者公有成员。

<2>作用域分辨符:如果派生类中有和基类同名的成员那么通过派生类对象通过‘.’运算符得到的是派生类中新增的成员。

 

#include<iostream>
using namespace std; 
class FunA
{
	public:
		int var;
		void funa_Func()
		{
			cout<<"FunA:var="<<var<<endl;	
		}
};
class FunB
{
	public:
		int var;
		void funb_Func()
		{
			cout<<"FunB:var="<<var<<endl;
		}
};
class FunAB:public FunA,public FunB
{
	public:
		int var;
		void funab_Func()
		{
			cout<<"FunAB:var="<<var<<endl;	
		}
};
int main()
{
	FunAB funab;
	FunAB *ptr=&funab;
	
	ptr->var=1;//为派生类Funab中的var赋值 
	ptr->funab_Func(); 
	
	ptr->FunA::var=2;//为派生类FunAB中的基类FunA的var赋值 
	ptr->FunA::funa_Func();
	
	ptr->FunB::var=3;//为派生类FunAB中的基类FunB的var赋值 
	ptr->FunB::funb_Func();
	
	return 0;
}

 

<3>虚基类

假设:有类Fun,那么FunA继承于Fun,FunB继承于Fun,又有FunAB继承于FunA和FunB,同样可一通过上述的方法进行访问,但是也可以用另一种方法。上述<2>的方法,是通过很多路径到达最后的目标成员,那么采用虚基类的方法可以直接访问,并只有一条路径。

 

#include<iostream>
using namespace std; 
class Fun
{
	public:
		int var;
		void fun_Func()
		{
			cout<<"Fun:var="<<var<<endl;	
		}
};
class FunA:virtual public Fun
{
	public:
		int vara;
};
class FunB:virtual public Fun
{
	public:
		int varb;
};
class FunAB:public FunA,public FunB
{
	public:
		int varab;
		void funab_Func()
		{
			cout<<"FunAB:var="<<varab<<endl;	
		}
};
int main()
{
	FunAB funab;
	FunAB *ptr=&funab;
	
	ptr->varab=1;//为派生类Funab中的varab赋值 
	ptr->funab_Func(); 
	
	ptr->var=3;//直接找到基类Fun的var 
	ptr->fun_Func();
	
	return 0;
}

 

 

<4>虚基类及其派生类构造函数

 

 

 

#include<iostream>
using namespace std; 
class Fun
{
	public:
		int var;
		Fun(int x):var(x)
		{
			cout<<"Fun"<<endl;
		} 
};
class FunA:virtual public Fun
{
	public:
		int vara;
		FunA(int x):Fun(x),vara(x)
		{
			cout<<"FunA"<<endl;
		}
};
class FunB:virtual public Fun
{
	public:
		int varb;
		FunB(int x):Fun(x),varb(x)
		{
			cout<<"FunB"<<endl;
		}
};
class FunAB:public FunA,public FunB
{
	public:
		int varab;
		FunAB(int x):Fun(x),FunA(x),FunB(x),varab(x)//这里虽然是对Fun初试化了三次但是C++编译器会解决这个问题,不担心 
		{
			cout<<"FunAB"<<endl;
		}
		void funab_Func()
		{
			cout<<"FunAB:var="<<varab<<endl;	
		}
};
int main()
{
	FunAB funab(3);
	funab.funab_Func();
	
	return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值