多态的基本介绍

  • 多态基础

    • 面向对象新求
    • 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++-多态的学习的更多相关文章

  1. No2_3.接口继承多态_Java学习笔记_多态

    ***多态***1.多态性:通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态:2.重写之所以具有多态性,是因为父类的方法在子类中被重写,方法名相同,实现功能不同. ...

  2. No2_1.接口继承多态_Java学习笔记_接口

    接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象 ...

  3. 9-C++远征之多态篇-学习笔记

    C++远征之多态篇 面向对象三大特征:封装,继承,多态 多态: 发出一条命令时,不同的对象接收到同样的命令做出的动作不同 多态篇会学习到的目录: 普通虚函数 & 虚析构函数 纯虚函数:抽象类 ...

  4. coffeeScript中类的多态[学习篇]

    类的一大应用就是多态.多态是一个面向对象编程的高级术语----“一个东西可编程很多不同的东西,但不是任何东西”.[引自coffeescript深入浅出] class Shape constructor ...

  5. No2_4.接口继承多态_Java学习笔记_经典案例

    import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...

  6. No2_2.接口继承多态_Java学习笔记_继承

    ***类的继承***1.继承的实现extends2.[修饰符] class 子类名 extends 父类名{}3.修饰符一般为:public abstract final4.重写是指父子类之间的关系, ...

  7. java多态中哪些成员具备多态特性

    在多态的学习中,当子类继承父类时,子类中的变量哪些具备多态特性,哪些不具备多特特性. 代码: class Father{ public static int x=10; public int y=11 ...

  8. 别样JAVA学习(五)继承上(1.0)Object类equals()

    上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...

  9. python学习之路基础篇(第七篇)

    一.模块 configparser configparser用于处理特定格式的文件,其本质是利用open来对文件进行操作 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [ ...

随机推荐

  1. Java数组使用以及foreach循环

    Java数组使用以及foreach循环 二话不说,先甩一个简单的程序: final int NUM= 10; int[] arrays = new int[NUM]; System.out.print ...

  2. 3 JAVA的基本变量类型

    1. 数字 整数型   类型 字节数  范围 int  4 -2^31~ 2^31-1 short 2 -2^15~ 2^15 -1 long 8 -2^63 ~ 2^63 -1 byte 1 -2^ ...

  3. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  4. Spring security (一)架构框架-Component、Service、Filter分析

    “致"高级"工程师(BUG工程师) 一颗折腾的心

  5. JSONPath小试牛刀之Snack3

    最近在网上看了些JSONPath的入门例子.打算用Snack3这个框架写写例子.json path对`JSON的处理绝对是神器. 1.准备JSON字符串 { "store": { ...

  6. gganimate|创建可视化动图,让你的图表会说话

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/kKQ2670FBiDqVCMuLBL9NQ 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...

  7. 相对和绝对路径、cd命令、创建和删除目录、rm命令 使用介绍

    第2周第1次课(3月26日) 课程内容:2.6 相对和绝对路径2.7 cd命令2.8 创建和删除目录mkdir/rmdir2.9 rm命令 2.6相对和绝对路径 任何一个文件都有一个从根开始的路径,绝 ...

  8. 漫谈边缘计算(三):5G的好拍档

    边缘计算的热度迅速攀升,还有一个不得不提的因素,就是5G的发展. [5G推动云计算从集中化向分布式演进] 在第一篇文章(<漫谈边缘计算(一):边缘计算是大势所趋>)中我提到,传统的云计算技 ...

  9. 技术谈 | SDN 和 NFV 之间的爱与恨

    部分开发者经常混淆 SDN 和 NFV,无法看清他们的关系.今天,小编搬出华为技术专家的一篇大稿,给大家掰扯掰扯:SDN 和 NFV 究竟是什么关系. ----文/闫长江 什么是 SDN 回到基本的概 ...

  10. python3.6异步IO包asyncio部分核心源码思路梳理

    关于python异步编程的演进过程,两篇文章阐述得妥妥当当,明明白白. 中文资料:https://mp.weixin.qq.com/s?__biz=MzIxMjY5NTE0MA==&mid=2 ...