继承
基本语法
class Person1
{
public:
int num;
int age;
};
class Person2 :public Person1//继承的基本语法
{
public:
string name;
};
//可以先写一个很多东西都共同拥有的部分
//再分别写特色部分,把共同拥有的部分继承下来
继承方式
继承的语法:class 子类 :继承方式 父类
继承方式的种类:
1.公共继承
2.保护继承
3.私有继承
公共继承:
设父类私有为int c=10;公共为int a=10;保护为int b=10;
class son1: public fu1
{
public:
void func()
{
a=10;//父类中的公共权限成员到子类中依然是公共权限,类外可以访问
b=10;//父类中的保护权限成员到子类中依然是保护权限,但是类外不能访问
//c=10;//父类中的私有权限成员子类访问不到
}
};
class son2: protected fu1
{
public:
void func()
{
a=10;//父类中公共成员,到子类中变为保护权限
b=10;//父类中保护成员,还是保护权限
//c=10;//父类 中的私有成员子类访问不到
}
};//所以如果子类继承的权限高父类中比子类权限低的全部变成子类权限
class son3:private fu2
{
public:
void func()
{
a=10;权限提高变成私有
b=10;权限提高变成私有
//c=10;只要父类中的私有成员子类访问不到
}
};//所以再创建一个子类son4继承son3,son3中的成员son4一个都访问不到
继承中的对象模型
问题:从父类继承过来的成员,那些属于子类对象中?
//父类中所以非静态成员属性都会被子类继承下去
//父类中私有成员属性 是被编译器隐藏了,因此访问不到,但是还是被继承下去了
方法:利用开发人员命令提示工具查看对象模型
//跳转盘符 磁盘:
//跳转文件路径 cd 具体路径下
//查看名称
//c1 /d1 reporSingleClassLayoutL类名 文件名
继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题:父类和子类的构造和析构顺序谁先谁后?
答案:父类先构造子类后构造,子类先析构父类后析构//类似栈的进出顺序
继承同名成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
1.访问子类同名成员 直接访问即可
2.访问父类同名成员 需要加作用域
//继承中同名成员处理
class fu
{
public:
int a;
fu()
{
a=10;
}
};
class son :public fu
{
public:
int a;
son()
{
a=20;
}
};
void test01()
{
son s;
cout<<s.a<<endl;
}//运行之后是子类中的a的取值
void test02()、
{
son s;
cout<<s.fu::a<<endl;
}//运行之后是父类中的a的取值
//所以要访问子类同名成员直接访问,访问父类要加作用域::
//如果访问父类同名成员函数要加作用域,访问子类直接访问就行
//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
//如果想访问到父类被隐藏的同名成员函数,需要加作用域
继承同名静态成员处理方式
问题:继承中同名的静态成员在子类对象上如何进行访问?
方法:静态成员和非静态成员出现同名,处理方式一致
1.访问子类同名成员,直接访问即可
2.访问父类同名成员,需要加作用域
//继承中的同名静态成员处理方式
class fu
{
public:
static int a;
};
int fu::a=10;//静态成员属性要在类外进行初始化
class son:public fu
{
public:
static int a;
};
int son::a=20;
//同名静态成员属性
void test01()
{
//1.通过对象访问
cout<<“通过对象访问:”<<endl;
son s;
cout<<s.a<<endl;//子类中的a
cout<<s.fu::a<<end;//父类中的a
//2.通过类名访问
cout<<“通过类名访问:”<<endl;
cout<<son::a<<endl;//子类中的a
cout<<son:🖕:a<<endl;//相当于从son继承fu的成员来访问fu的成员
//第一个::代表通过类名方式访问 第二个::代表访问父类作用域下
}
多继承语法
c++允许一个类继承多个类
语法:class 子类:继承方式 父类, 继承方式 父类2…(就是一个儿子多个爹)
问题:多继承可能会引发父类中同名成员出现,需要加作用域区分
建议:c++实际开发中不建议用多继承、
菱形继承
概念:
两个派生类继承同一个基类,又有某个类同时继承这两个派生类,这种继承被称为菱形继承,也叫钻石继承
问题:会产生二义性