c++-多态的学习
多态的基本介绍
多态基础
- 面向对象新求
- C++编译器提供的多态解决方案
- 多态意义、多态成立的是三个条件
- 多态理论基础
多态面试题强化
- 多态的理解
- C++编译器如何实现多态
- 重载重写重定义
- 虚析构函数
- 可否为每个类的普通成员函数定义为虚函数
- 构造函数中调用虚函数,能实现多态吗?
- 虚函数表指针vptr指针分步初始化
- 父类指针和子类指针步长不一样 和 父类指针指向子类对象 两个不同的概念
多态原理探究
- 总结记忆1:C++编译器提前布局,在类对象中增加vptr指针、虚函数入口地址存虚函数表
- 总结记忆2: C++编译器并不是区分子类对象和父类对象,而是根据对象指针、找vptr指针,再找虚函数入口,实现迟绑定,支持了多态
多态发生的三个必要条件:
- 要有继承。
- 要有虚函数重写。
- 父类指针或引用 指向 子类对象。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//岳不群
class Yuebuqun
{
public:
Yuebuqun( string kongfu)
{
this->kongfu = kongfu;
}
virtual void fight() //标识修饰一个成员方法是一个虚函数。
{
cout << "岳不群" << "使出了" << kongfu << "打人" << endl;
}
void print()
{
}
string kongfu;
};
//林平之 继承了 岳不群
class Linpingzhi :public Yuebuqun
{
public:
Linpingzhi(string kongfu) :Yuebuqun(kongfu)
{
}
//如果说父类中有一个虚函数是fight( ), 子类如果去重写这个虚函数。
void fight()
{
cout << "林平之" << "使出了" << kongfu << "打人" << endl;
}
void print()
{
}
};
class Linghuchong :public Yuebuqun
{
public:
Linghuchong(string kongfu) :Yuebuqun(kongfu)
{
}
void fight()
{
cout << "令狐冲 " << "使用了" << kongfu << endl;
}
};
//在全局提供一个打斗的方法
void fightPeople(Yuebuqun *hero)//Yuebuqun *hero = xiaopp; Yuebuqun *hero = xiaoyy;
{
cout << "调用打人的方法" << endl;
hero->fight();//希望传递进来的如果是子类,调用子类的fight
//如果传递进来的是父类, 调用父类的fight
//这种行为就是 多态行为。
}
int main(void)
{
Yuebuqun *xiaoyy = new Yuebuqun("葵花宝典");
//xiaoyy->fight();
Linpingzhi *xiaopp = new Linpingzhi("僻邪剑谱");
//xiaopp->fight();
Linghuchong *xiaoll = new Linghuchong("独孤九剑");
fightPeople(xiaoyy);
fightPeople(xiaopp);
fightPeople(xiaoll);
//编译器默认做了一个安全的处理。 编译认为 不管传递时子类对象还是父类对象,
//如果统一执行父类d方法 那么是一定可以被成功执行。
delete xiaoyy;
delete xiaopp;
delete xiaoll;
return 0;
}
多态案例及其意义
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//英雄类
//1999
class Hero
{
public:
virtual int getAd() {
return 10;
}
};
//1999
class AdvHero :public Hero
{
public:
virtual int getAd()
{
return 1001;
}
};
//怪兽类
//1999
class Monster
{
public:
int getAd() {
return 1000;
}
};
//战斗方法
//1999 //写的架构函数,可以调用未来。
void playerFight(Hero *hp, Monster *mp)
{
//多态对于编译器来讲的,也是一个动态联编,也是一个迟邦定。
if (hp->getAd() > mp->getAd()) { //hp->getAd 发生了多态
cout << "英雄胜利, 怪兽被打死" << endl;
}
else {
cout << "英雄挂了,怪兽赢了" << endl;
}
}
//2020年
class BugHero :public Hero
{
public:
virtual int getAd()
{
cout << "调用了bugHero的方法" << endl;
return 66666;
}
};
int main(void)
{
Hero h;
Monster m;
playerFight(&h, &m);
AdvHero advH;
playerFight(&advH, &m);
BugHero bH;
playerFight(&bH, &m);
int a = 10;
int b = 20;
cout << a << endl;
if (a > 10) { //迟邦定
cout << "a>10" << endl;
}
else {
cout << "a < 10" << endl;
}
return 0;
}
c++-多态的学习的更多相关文章
- No2_3.接口继承多态_Java学习笔记_多态
***多态***1.多态性:通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态:2.重写之所以具有多态性,是因为父类的方法在子类中被重写,方法名相同,实现功能不同. ...
- No2_1.接口继承多态_Java学习笔记_接口
接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象 ...
- 9-C++远征之多态篇-学习笔记
C++远征之多态篇 面向对象三大特征:封装,继承,多态 多态: 发出一条命令时,不同的对象接收到同样的命令做出的动作不同 多态篇会学习到的目录: 普通虚函数 & 虚析构函数 纯虚函数:抽象类 ...
- coffeeScript中类的多态[学习篇]
类的一大应用就是多态.多态是一个面向对象编程的高级术语----“一个东西可编程很多不同的东西,但不是任何东西”.[引自coffeescript深入浅出] class Shape constructor ...
- No2_4.接口继承多态_Java学习笔记_经典案例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...
- No2_2.接口继承多态_Java学习笔记_继承
***类的继承***1.继承的实现extends2.[修饰符] class 子类名 extends 父类名{}3.修饰符一般为:public abstract final4.重写是指父子类之间的关系, ...
- java多态中哪些成员具备多态特性
在多态的学习中,当子类继承父类时,子类中的变量哪些具备多态特性,哪些不具备多特特性. 代码: class Father{ public static int x=10; public int y=11 ...
- 别样JAVA学习(五)继承上(1.0)Object类equals()
上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...
- python学习之路基础篇(第七篇)
一.模块 configparser configparser用于处理特定格式的文件,其本质是利用open来对文件进行操作 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [ ...
随机推荐
- Power Query系列 - 排序Ranking
Power Query系列 - 排序Ranking 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况: 在数据分析中,我们常常需要对数据进行排序,同时我们想知道某个项目或者产品的排名, ...
- day 37 CSS
参考博客:https://www.cnblogs.com/majj/p/9021419.html 1.CSS的三种链接样式: 行内链接(优先级最高) 内接样式 外接样式 <html lang=& ...
- 迁移桌面程序到MS Store(13)——动态检查Win10 API是否可用
假设我们现有一个WPF程序,需要支持1903以前的Windows 10版本.同时在1903以后的版本上,额外多出一个Ink的功能.那么我们就可以通过ApiInformation.IsApiContra ...
- TensorBoard:可视化学习
数据序列化 TensorBoard 通过读取 TensorFlow 的事件文件来运行.TensorFlow 的事件文件包括了你会在 TensorFlow 运行中涉及到的主要数据.下面是 TensorB ...
- SpringBoot学习(七)—— springboot快速整合Redis
目录 Redis缓存 简介 引入redis缓存 代码实战 Redis缓存 @ 简介 redis是一个高性能的key-value数据库 优势 性能强,适合高度的读写操作(读的速度是110000次/s,写 ...
- CentOS 7 安装 bind 服务 实现内网DNS
目录 安装 配置 服务管理 测试 安装 废话不多说,直接安装 yum install -y bind bind-utils 配置 [root@jenkins named]# rpm -ql bind ...
- JavaScript的定时器是如何工作的
理解JavaScript定时器工作原理对于学习JavaScript非常重要.因为JavaScript是单线程运行的,定时器使用场合少,不是很直观.下面通过三个函数来学习JavaScript如何定义,操 ...
- HTML 创建按钮实现跳转链接
1.使用 form<form method="get" action="/page2"> <button type="submit& ...
- 向mysql数据表中插入数据失败的原因
1.案例代码: $sql1="insert into content(category,subject,content,username,release_date) values('{$ca ...
- 2019-2020-7 20199317《Linux内核原理与分析》第七周作业
第6章 进程的描述和进程的创建 1 进程的描述 操作系统内核实现操作系统的三大管理功能,即进程管理.内存管理和文件系统.其中,操作系统内核中最核心的功能是进程管理.为了管理进程,内核要 ...