C++之继承关系(易懂篇)
继承概述:
C++提供了类继承的方法来扩展和修改类,该方法可以从已有的类中派生出新的类,而派生类继承了原有类的特征(包括方法)。派生类和基类之间的特殊关系是基类C++继承的底层模型。C++有三种继承关系:公有继承;私有继承,和保护继承等。
继承关系是is-a的关系,包括基类(父类)与派生类(子类)的关系,
继承关系可访问的类关系表示如下表格:
公有继承关系,可访问基类的公有成员和保护成员,不能访问私有成员,举例如下:
class father {
public:
void FathPrints() {
printf("访问父类1\n");
}
int a;
int b;
private:
int c;
protected:
void printsP() {
printf("访问父类2\n");
}
};
class child :public father {
public:
void ChildPrints() {
printf("子类输出1\n");
printsP();//子类能访问父类的protected成员变量和函数
}
//int a;
private:
int b;
};
int main()
{
child c;
c.FathPrints();//共有继承,可访问父类
c.ChildPrints();
//c.printsP();//不能访问
system("pause");
return 0;
}
输出结果如下:
保护继承关系,可访问基类的公有成员和保护成员,不能访问私有成员,举例如下:
class father {
public:
void FathPrints() {
printf("访问父类1\n");
}
int a;
int b;
private:
void printsPr() {
printf("访问父类3\n");
}
protected:
void printsP() {
printf("访问父类2\n");
}
};
class child :protected father {
public:
void ChildPrints() {
printf("子类输出1\n");
FathPrints();//子类能访问父类的protected成员变量和函数
printsP();//子类能访问父类的protected成员变量和函数
//printsPr();//不能访问父类private成员变量和函数
}
//int a;
private:
int b;
};
int main()
{
child c;
//c.FathPrints();//不可访问父类
c.ChildPrints();
//c.printsP();//不能访问
system("pause");
return 0;
}
输出结果:
当基类和派生类中,定义相同的成员函数及变量时,其访问方式如下面代码所示;
class father {
public:
void prints() {
printf("fa=%d,fb=%d\n", a, b);
}
int a;
int b;
private:
int c;
protected:
void printsP() {
printf("f3=%d\n", b);
}
int f;
};
class child :public father {
public:
void prints() {
f = 10;//子类能访问父类的protected成员变量和函数
printf("ca=%d,f=%d\n", a,f);
printsP();//子类能访问父类的protected成员变量和函数
}
int a;
private:
int b;
};
class other_ {
public:
father fath;
void oprints() {
printf("oa=%d,ob=%d",oa,ob);
fath.prints();//可访问父类
}
public:
int oa;
int ob;
};
int main()
{
child c;
c.father::a = 1;//父类访问方法
c.father::b = 2;
c.father::prints();
c.a = 3;//子类的成员变量,自动覆盖父类成员变量
c.prints();
system("pause");
return 0;
}
思绪不清晰,继续努力