/**
*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();//错误!同上
}