C++学习系列3 继承与多态

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;
当类中有了纯虚函数,这个类也称作为抽象类。
作用:主要用于子类的继承,本身无法实例化对象,子类也必须重写纯虚函数,否则也属于抽象类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Curious*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值