多态的基本语法

#include<iostream>
using namespace std;
//动态多态满足条件
//1.有继承关系
//2.子类要重写父类的虚函数,注意重载是函数名相同但参数不同
//重写 函数返回值类型 函数名 参数列表 完全相同//动态多态的使用
//父类的指针或引用执行子类对象
class Animal {
public://虚函数virtual void speak() {cout << "动物在说话" << endl;}
};
class Dog :public Animal{
public:void speak() {cout << "汪汪叫" << endl;}
};
class Cat :public Animal {
public:void speak() {cout << "喵喵叫" << endl;}};
//地址早绑定,在编译阶段确定函数地址
//如果想执行让猫说话,则函数的地址需要在运行阶段绑定,地址晚绑定
//父类引用指向子类的对象
void doSpeak(Animal &animal) {// Animal &animal = cat;animal.speak();
}
void test01() {Cat cat;Dog dog;doSpeak(cat);doSpeak(dog);
}
void test02() {cout << "sizeof animal = " << sizeof(Animal) << endl;
}int main() {//test01();test02();return 0;
}

案例1——计算器类

#include<iostream>
#include<cstring>
using namespace std;
class Calculator {
public:int getResult(string oper) {if (oper == "+")return m_num1 + m_num2;else if (oper == "-")return m_num1 - m_num2;else if (oper == "*")return m_num1 * m_num2;//如果扩展新功能,需要修改源码//开发中提倡开闭原则//开闭原则:对扩展进行开发,对修改进行关闭}int m_num1;int m_num2;
};
void test01() {Calculator c;c.m_num1 = 10;c.m_num2 = 10;cout << c.m_num1 << "+" << c.m_num2 << "=" << c.getResult("+") << endl;cout << c.m_num1 << "-" << c.m_num2 << "=" << c.getResult("-") << endl;cout << c.m_num1 << "*" << c.m_num2 << "=" << c.getResult("*") << endl;
}//利用多态实现计算器
class AbstractCalculator {
public:virtual int getResult() {return 0;}int m_num1;int m_num2;
};class Add :public AbstractCalculator {
public:int getResult() {return m_num1 + m_num2;}};class Sub :public AbstractCalculator {
public:int getResult() {return m_num1 - m_num2;}};class Mul :public AbstractCalculator {
public:int getResult() {return m_num1 * m_num2;}};
void test02() {//多态使用条件//父类指针或者引用指向子类对象AbstractCalculator* abc = new Add;abc->m_num1 = 100;abc->m_num2 = 100;cout << abc->m_num1 << " + " << abc->m_num2 << " = " << abc->getResult() << endl;delete abc;abc = new Sub;abc->m_num1 = 100;abc->m_num2 = 100;cout << abc->m_num1 << " - " << abc->m_num2 << " = " << abc->getResult() << endl;delete abc;abc = new Mul;abc->m_num1 = 100;abc->m_num2 = 100;cout << abc->m_num1 << " * " << abc->m_num2 << " = " << abc->getResult() << endl;delete abc;}
int main() {//test01();test02();return 0;
}

纯虚函数和抽象类

#include<iostream>
using namespace std;
class Base {
public://纯虚函数//只要有一个纯虚函数,就是抽象类 无法实例化对象virtual void func() = 0;};class Son:public Base {
public://抽象类的子类必须要重写父类中的纯虚函数,否则也属于抽象类void func() {cout << "this is son" << endl;}};void test01() {Base* base = new Son;base ->func();delete base;
}int main() {test01();return 0;
}

案例2——制作饮品

#include<iostream>
using namespace std;
//多态案例2 制作饮品
class AbstractDrinking {
public://煮水virtual void Boil() = 0;//冲泡virtual void Brew() = 0;//导入杯中virtual void PourInCup() = 0;//加入辅料virtual void PutSomething() = 0;void makeDrink() {Boil();Brew();PourInCup();PutSomething();}
};class Cofee :public AbstractDrinking {
public:void Boil() {cout << "煮矿泉水" << endl;}void Brew() {cout << "冲咖啡" << endl;}void PourInCup() {cout << "倒入杯中" << endl;}void PutSomething() {cout << "加点糖" << endl;}};//制作茶叶class Tea :public AbstractDrinking {
public:void Boil() {cout << "煮自来水" << endl;}void Brew() {cout << "放茶叶" << endl;}void PourInCup() {cout << "倒入杯中" << endl;}void PutSomething() {cout << "加柠檬" << endl;}};void doWork(AbstractDrinking &abs) {abs.makeDrink();
}void test01() {Cofee c;Tea t;doWork(c);doWork(t);
}int main() {test01();return 0;
}

虚析构和纯虚析构

#include<iostream>
#include<cstring>
using namespace std;
class Animal {
public:Animal() {cout << "animal构造函数调用" << endl;}//利用虚析构指针可以解决 父类释放子类对象时不干净的问题/*virtual ~Animal() {cout << "animal虚析构函数调用" << endl;}*///纯虚析构 需要声明也需要实现//有纯虚析构函数 也属于抽象类 无法实例化virtual ~Animal() = 0;virtual void speak() = 0;};Animal::~Animal() {cout << "animal纯虚析构函数调用" << endl;
}class Cat :public Animal {
public:Cat(string name) {m_name = new string(name);cout << "cat构造函数调用" << endl;}void speak() {cout << *m_name << "喵喵叫" << endl;}~Cat() {if (m_name != NULL)delete m_name;m_name = NULL;cout << "cat析构函数调用" << endl;}string* m_name;
};void test01() {Animal* a = new Cat("汤姆");a->speak();//父类的指针在析构时 不会调用子类中的析构函数,导致子类如果有堆区属性,会内存泄露。delete a;}int main() {test01();return 0;
}

案例3——电脑组装

#include<iostream>
using namespace std;
class Cpu {
public:virtual void calculator() = 0;
};class VideoCard {
public:virtual void display() = 0;
};class Memory {
public:virtual void storage() = 0;
};
class Intel :public Cpu, public VideoCard, public Memory{
public:void calculator() {cout << "intel cpu正在运行" << endl;}void display() {cout << "intel 显卡正在运行" << endl;}void storage() {cout << "intel 内存正在运行" << endl;}
};class Lenovo :public Cpu, public VideoCard, public Memory {
public:void calculator() {cout << "lenovo cpu正在运行" << endl;}void display() {cout << "lenovo 显卡正在运行" << endl;}void storage() {cout << "lenovo 内存正在运行" << endl;}
};//电脑类
class Computer {
public:Computer(Cpu *c, VideoCard *v, Memory *m) {m_c = c;m_v = v;m_m = m;}void doWork() {m_c->calculator();m_v->display();m_m->storage();}~Computer() {if (m_c != NULL) {delete m_c;m_c = NULL;}//0x000002dde96fc100 {m_c=0x0000000000000000 <NULL> m_v=0x000002dde96fbb68 {...} m_m=0x000002dde96fc3b0 {...} }if (m_m != NULL) {delete m_m;m_m = NULL;}if (m_v != NULL) {delete m_v;m_v = NULL;}cout << "析构函数已执行" << endl;}
private:Cpu* m_c;VideoCard* m_v;Memory* m_m;};void test01() {Cpu* c = new Intel;VideoCard* v = new Intel;Memory* m = new Intel;Computer* computer = new Computer(c, v, m);computer -> doWork();delete computer;
}int main() {test01();return 0;
}

C++(七)——多态相关推荐

  1. python面相对象编程指南_Python面向对象编程指南

    抽象是隐藏多余细节的艺术.在面向对象的概念中,抽象的直接表现形式通常为类.虽然Python是解释性语言,但是它是面向对象的,从设计之初就已经是一门面向对象的语言.Python基本上提供了面向对象编程语 ...

  2. ap java内容_AP 计算机知识点总结

    AP Computer Science Principles 是美国大学先修课程体系里的一门,其课程和考试由美国大学理事会主持,是提供给美国高中在校生先修大学同等级别计算机科学原理的课程.该课程是计算 ...

  3. 简明Python教程学习笔记_6_面向对象编程

    面向对象编程:https://www.liaoxuefeng.com/wiki/897692888725344/923030496738368 面向对象高级编程:https://www.liaoxue ...

  4. 重拳出击之《JVM》面试官版 (初哥勿看)

    <fonr color = black>JVM发展史,虚拟机发展史模块 java技术体系包括了几个组成部分? javaME.SE.EE分别是什么? 都说JDK7版本是第一个里程碑版本,为什 ...

  5. [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托

    [ASP.NET入门随想七]主角与配角 --OO思想的多态.接口与委托 曾几何时,我们的父辈接受到的对美好生活的描绘是:"楼上楼下.电灯电话",三十年过去了,电灯电话早已已成为我们 ...

  6. 深入.NET平台和C#编程笔记 第七章 深入理解多态

    第七章 深入理解多态 1.里氏替换原则: 在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换. 父类变量指向子类对象!! 2.Is 和as Is 做类型判定 ...

  7. 【JAVA SE】第七章 继承和多态

    第七章 继承和多态 文章目录 第七章 继承和多态 一.继承 1.概念 2.继承的特性 2.继承关键字 3.构造器 4.子类重写父类方法的规则 二.多态 1.概念 2.多态的优点 3.多态存在的三个必要 ...

  8. C#学习七(包含File字节流,list泛型集合、拆装箱、ictionary字典,文件流FileStream、StreamReader和StreamWrite、多态)

    一.对前面部份的总结 using System.Collections; using System.IO; using System.Text;namespace _074_复习 {class Pro ...

  9. 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态

    ###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...

最新文章

  1. Direct2D教程(三)简单几何图形
  2. 自定义函数_Access中的WorkDate自定义函数
  3. Flex 学习笔记 动态设置itemRenderer
  4. select for update
  5. 数学图形(1.5)克莱线
  6. mug网络用语_下面这些短语你尽管翻译,全对算我输!
  7. Python_地址中左斜线和右斜线的区别——Python系列学习笔记
  8. SAP Netweaver ECATT介绍
  9. wps中图片怎么居中_wps图片怎么添加推动声
  10. idea 和 maven学习
  11. 017—mysql问答
  12. Kubernetes集群的安装部署
  13. clickhouse: A股bar数据与物化视图尝试
  14. 斗鱼tv 服务器响应失败,斗鱼tv打不开怎么办 斗鱼直播打不开得解决办法
  15. 计算机默认登录用户名和密码是什么,Windows7默认管理员账户用户名和密码是什么...
  16. Nature Microbiology | 王璋/陈荣昌/周宏伟-慢阻肺病呼吸道菌群-宿主互作机制
  17. 汇编程序设计与计算机体系结构软件工程师教程笔记:总结
  18. 网络协会评出十大流氓软件,3721位列榜首
  19. DIY 3D打印机——【有啥用啥版】
  20. H2 DataBase入门

热门文章

  1. linux重定向进程输出到文件删除,Linux文件编辑器vim输出输入重定向、管道以及进程(示例代码)...
  2. 无符号 byte java_我们能用Java做无符号字节吗?
  3. 成功解决on line , but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
  4. AI:2020年6月21日北京智源大会演讲分享之14:00-14:25 张铭教授《基于知识图谱的机器学习》
  5. 成功解决ModuleNotFoundError: No module named engine
  6. DL之DNN优化技术:DNN中抑制过拟合/欠拟合、提高泛化能力技术的简介、使用方法、案例应用详细攻略
  7. CV之ICG:计算机视觉之图像标题生成(Image Caption Generator)算法的简介、使用方法、案例应用之详细攻略
  8. 解决问题ImportError: HDFStore requires PyTables, quot;No module named 'tables'quot; problem importing
  9. English:daydayup
  10. MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测