目录
关于“爸爸 的朋友”可以访问“儿子”那些内容与“爸爸的朋友的儿子”可以访问的内容研究
特别强调,本文章全说作者个人实验结论与自己推测结果,如有不正确欢迎在评论区或者私信讨论
继承的研究实验
三类继承方式中子类继承父类后的属性转换
基础理论
继承方式有三种 公共继承,保护继承,私有继承。
父类也叫基类,子类也叫派生类。
格式为class 子类:继承方式 父类
代码实现
#include <iostream>
class baba//爸爸类即父类
{
public:
int a;//公共变量都能访问
protected:
int b;//保护变量派生类(即子类)可访问
private:
int c;//私有变量(子类也不可以访问)
};
class daer :public baba//大儿子,使用公共继承爸爸
{
public:
void dia() {
a = 100;
b = 100;
c = 100;
}
};
class erer :protected baba//二儿子,使用保护继承爸爸
{
public:
void dia() {
a = 100;
b = 100;
c = 100;
}
};
class saner :private baba//三儿子,使用私密继承爸爸
{
void dia() {
a = 100;
b = 100;
c = 100;
}
};
//三类继承都不能访问爸爸的私密变量c说明父类的私密变量子类也不能访问
class ce//调动大儿子以测试大儿子的变量情况
{
void dadia() {
daer da;
da.a = 100;
da.b = 100;
da.c = 100;
}
};
//大儿子的a可以访问,但b,c不行,因为父类的b,c是保护和私有属性,
//可知道公共继承时保护属性继承还是保护,私有继承还是私有
class ceo//调用二儿子变量
{
void erdia() {
erer da;
da.a = 100;
da.b = 100;
da.c = 100;
}
};
//可见三个都不能访问,可见保护继承公共变量也变成了保护变量
class dasun :public daer//大孙子,继承大儿子
{
void dia() {
a = 100;
b = 100;
c = 100;
}
};//发现可访问a,b,可见在孙子
class ersun :public erer//二孙子,继承二儿子
{
void dia() {
a = 100;
b = 100;
c = 100;
}
};//c不可访问,可见孙子也不能访问爷爷私有变量。
class cet//调用二儿子变量
{
void sundia() {
ersun da;
da.a = 100;
da.b = 100;
da.c = 100;
}
};//调用二孙,发现a,b,c皆是不能访问,可见二孙继承的类已经不是公共类。但二二孙可以访问,所以是保护类
class sansun :public saner//三孙子,继承三儿子
{
void dia() {
a = 100;
b = 100;
c = 100;
}
};//三个不能访问,可见三儿的变量都是私有变量了。
结果截图
结论
三类继承共同点:
所有子类继承都不能访问父类的私有变量
可以访问父类的
公共继承
父类中公共为公共,保护为保护
保护继承
父类中所有为保护
私有继承
父类中所有为私有
实现额外内容
关于b private继承a类public时,使用using变为public
class baba
{
public:
int a=10;
int b=100;
int c=1000;
};
class saner :private baba
{
public:
using baba::a;
};
class ce {
void yong() {
saner san;
san.a = 11;//不会报错,可见成功改为了public
//san.b = 11;//会报错,可见成功继承并且为私密
}
};
多继承
多继承的格式
class 子类:继承方式 父类 ,继承方式 父类
继承与多继承同名问题
子类中的同名成员会覆盖父类中所有的同名成员(包括重载)