<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;
}