继承的好处
减少重复代码
语法:【class 子类:继承方式 父类】
- 子类——派生类
- 父类——基类
继承方式
- public: 父类中的public和protected成员属性不变,private的不可以访问
- private:父类中的public和protected成员属性都变为private,private的不可以访问
- protected:父类中的public和protected成员属性都变为protected,private的不可以访问
父类中所有的成员变量都会被子类继承, 只是私有成员会被隐藏起来
利用开发人员命令提示工具查看对象模型(vs studio):
- 在项目路径下cl /dl reportSingleClassLayout类名 文件名
继承中构造和析构的顺序
- 父类构造
- 子类构造
- 子类析构
- 父类析构
同名成员处理方式
class Base{
public:
Base(){
int A=100;
}
};
class Son:public Base{
public:
Son(){
A=100;
}
int A;
}
void test(){
Son s;
cout<<s.A<<endl;
//输出100,为子类的成员变量
cout<<s.Base::A<<endl;
//输出200,为父类的成员变量
}
如果子类中出现和父类中同名的成员函数,父类中的同名成员函数会被隐藏,无法直接访问,需要访问父类需要加上作用域
同名静态成员处理方式
class Base{
public:
static int a;
};
int Base::a=100;
class Son{
public:
static int a;
}
int Son::a=200;
void test(){
//1. 通过对象访问
Son s;
cout<<s.a<<endl;
//输出200,访问的是子类
cout<<s.Base::a<<endl;
//输出100,父类
//2.通过类名访问
cout<<Son::a<<endl;
//输出200
cout<<Son::Base::a<<endl;
//输出100,第一个::通过类名方式访问,第二个::访问父类作用域
}
多继承语法
(不建议使用)
class Base1{};
class Base2{};
class Son:public Base1, public Base2{};
菱形继承
定义:b和c均继承于类a,而类d同时继承于b和c
对于a中的属性,b和c中均有继承,因此d中会继承两次,出现二义性
解决方式:虚继承,在继承之前加上关键字virtual
class sheep :virtual public animal{};
虚继承以后,只有一份数据
如图,sheepTuo中保存的是sheep和tuo类的虚基准指针,该指针指向虚基址表,通过当前位移加上虚基址表中保存的地址,可获得数据的地址