C++继承
1 继承
1.1 语法
作用:减少重复代码
class Java():public BasePage{//继承使用冒号和public
public:
void content(){
cout<<"this is java page!<<endl;
}
}
//继承多类时
class 子类():继承方式 父类,继承方式 父类
{
}
//利用虚继承 解决菱形继承问题
//继承之前加上virtual 关键字,如果两个类成员同名,继承则只有一个
语法:class 子类:继承方式 父类
子类也称为派生类,父类称作为基类
1.2 继承方式
父类的私有内容不可继承
公共继承:除私有内容以外均不变,不能继承私有内容
保护继承:所有内容继承为保护属性
私有继承:所有内容继承为私有属性
1.3 继承中的对象模型
1、父类中所有非静态成员都会被子类继承下去
2、父类中私有成员属性,被编译器隐藏因此不能访问,但确实是继承了的
通过visual studio开发人员命令提示符查看对象模型
命令:c1 /dl reportSingleClassLayout类名 文件名
1.4 继承中构造和析构顺序
在继承中,先创建父类在创建子类,销毁子类后销毁父类。
1.5 继承中同名成员处理方式
1、访问子类同名,直接访问
2、访问父类同名成员,加上作用域 ::
调用父类成员函数:
如果是成员,则直接加作用域 子类.父类::成员名,如果是函数,则需要加 子类.父类::函数名
注:如果子类和父类成员函数重名,子类同名成员会隐藏所有父类的同名成员函数
1.6 继承同名静态成员处理方式(static)
访问子类同名 直接访问
访问父类同名 需要加作用域
1、通过对象访问
2、通过类名方式访问
//静态变量与静态函数访问类似
//通过对象访问
Son S1;
S1.m_A;
S1.Base::m_A;
//通过类访问
Son::m_A;//子类访问
Son::Base::m_A;//父类访问
2 多态
2.1 多态基本语法
分类:静态多态:函数重载、运算符重载均属于静态多态,服用函数名
动态多态:派生类以及虚函数实现运行时多态
区别:静态多态的函数地址早绑定,编译阶段确定函数地址
动态多态的函数地址晚绑定,运行阶段确定函数地址
//父类的引用只想子类的对象
class Animal{
public:
virtual void speak(){//加上virtual表示虚函数,则可以在后面执行说话函数变为继承的子类在说话
cout<<"动物在说话"<<endl;
}
}
class Cat:public Animal{
public:
void speak(){
cout<<"猫在说话"<<endl;
}
}
//执行说话的函数
void doSpeak(Animal &Animal){
Animal.speak();
}
void test01(){
Cat cat;
doSpeak(cat);
//加了虚函数后会重写虚函数,但函数类型、返回值类型和参数必须一致
//未加虚函数时此时执行的是动物在说话,父类
}
满足条件:存在继承关系,子类重写父类中的虚函数
使用条件:父类指针或引用只想子类对象
重写:函数返回值类型、函数名、参数列表完全一致称为重写
2.2 多态的原理剖析
1、空类大小是1B,指针类型大小是4B
当你使用虚函数的时候,会创建一个指针,vfptr指针,分别代表 virtual function(table) pointer 又称作虚函数(表)指针
当子类重写父类的虚函数,子类中的虚函数内部会替换成子类的虚函数地址
这部分可以通过命令行的命令进行查看结构,代码如上c1 /dl reportSingleClassLayout类名 文件名,可以看到不同的结构
2.3 纯虚函数
语法:virtual 返回值类型 函数名(参数列表)=0;
当类中有了纯虚函数,这个类也称作为抽象类。
作用:主要用于子类的继承,本身无法实例化对象,子类也必须重写纯虚函数,否则也属于抽象类