c++多态--2(计算器,纯虚函数和抽象类)

为什么要用多态

  1. 早期方法不利于扩展
  2. 开闭原则 开闭原则 对扩展开放 对修改关闭
  3. 利用多态实现—利于后期扩展,结构性非常好,可读性高,效率稍微低,发生多态内部结构复杂

多态成立的条件

  1. 又继承

  2. 子类重写父类虚函数的函数:

    a)返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外)
    b)子类中virtual关键字可写可不写,建议写

  3. 类型兼容 父类指针,父类引用,指向子类对象

抽象基类和纯虚函数

  1. 在设计时,常常希望基类仅仅作为其派生类的一个接口,这就是说,仅想对基类进行向上类型转换,使用它的接口,
    而不希望用户实际的创建一个基类的对象,同时创建一个纯虚函数允许接口中放置成员原函数,而不是要提供一段可能对这个函数毫无意义的代码。

  2. 做到这点,可以在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class)

  3. 纯虚函数使用关键字virtual,并在其后面加上=0,如果试图去实例化一个抽象类,编译器则会阻止这种操作。

  4. 当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类

  5. Virtual void fun()=0;告诉编译器在vtable中为函数保留一个位置,但在这个特定位置不放地址

建立公共接口目的是为了将子类公共的操作抽象出来,可以通过一个公共接口来操纵一组类,且这个公共接口不需要事先(或者不需要完全实现)。可以创建一个公共类

#include<iostream>using namespace std;
/*
class Calculator
{
public:void setv1(int v){this->val1 = v;}void setv2(int v){this->val2 = v;}int getResult(string oper){if (oper == "+"){return val1 + val2;}else if (oper == "-"){return val1 - val2;}}private:int val1;int val2;
};
void test01()
{Calculator cal;cal.setv1(10);cal.setv2(10);cout << cal.getResult("+") << endl;cout << cal.getResult("-") << endl;
}
*///真正的开发中,有个开发原则,开闭原则
//对扩展开放 对修改关闭//利用多态实现计算器
class abstractCalculator
{
public:void setv1(int v){this->val1 = v;}void setv2(int v){this->val2 = v;}//virtual int getResult(){return  0;} 虚函数//纯虚函数//如果父类中有了纯虚函数  子类继承了父类,必须要实现纯虚函数//如果父类中 有了纯虚函数,这个父类,就无法实例化对象了//这个类中有了纯虚函数,通常又称为 抽象类virtual int getResult() = 0;public:int val1;int val2;
};
//如果父类中有了纯虚函数  子类继承了父类,必须要实现纯虚函数
class A :public abstractCalculator
{
public:virtual int getResult(){//return 0;}};//加法计算器 
class PlusCaculator :public abstractCalculator
{
public:virtual int getResult(){return val1 + val2;}
};
//减法计算器
class SubCalculator : public abstractCalculator
{
public:virtual int getResult(){return val1 - val2;}
};//乘法计算器
class ChengCalculator : public abstractCalculator
{
public:virtual int getResult(){return val1*val2;}
};void test01()
{abstractCalculator *abc = new PlusCaculator;//加法计算器abc = new PlusCaculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;delete abc;abc = new SubCalculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;delete abc;abc = new ChengCalculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;//如果父类有了纯虚函数,不能实例化对象了/*abstractCalculator aaa;abstractCalculator *abc = new abstractCalculator;*/
}int main()
{test01();system("pause");return 0;
}
  1. 纯虚函数写法 virtual void func()=0;
  2. 抽象类型
  3. 抽象类 不可实例化对象
  4. 如果类 继承了抽象类,必须重写抽象类中的纯虚函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Automake和Autoconf生成Makefile

automake 所产生的 Makefile 除了可以做到程序的自动编译和链接 外&#xff0c;还可以用来生成各种文档&#xff08;如manual page、info文件&#xff09;&#xff0c;可以将源代码文件包装起来以供发布。所以程序源代码所存放的目录 结构最好符合GNU的标准惯例。下面以hello.…

c++中多态---3(虚析构和纯虚析构,向上类型转化和向下类型转化)

虚析构和纯虚析构 虚析构virtual ~类名(){}类内声明&#xff0c;类内实现解决问题&#xff1a;通过父类指针指向子类对象释放时候不干净的问题 纯虚析构 写法 virtual ~类名(){}0; 类内声明 类外实现 如果出现了纯虚析构函数&#xff0c;这个类也算是抽象类&#xff0c;不可…

嵌入式开发硬件知识札记

三态逻辑 1. 概念 三态指其输出既可以是一般二值逻辑电路&#xff0c;即正常的高电平&#xff08;逻辑1&#xff09;或低电平&#xff08;逻辑0&#xff09;&#xff0c;又可以保持特有的高阻抗状态。高阻态相当于隔断状态&#xff08;电阻很大&#xff0c;相当于开路&#xff…

《凡人修仙传》中打斗场景(c++多态实现)

我们 要实现打斗场景&#xff0c;第一&#xff0c;我们需要有打斗的双方&#xff0c;一个是英雄&#xff0c;一个是怪物&#xff0c;他们都有自己的属性&#xff0c;比如攻击&#xff0c;防御&#xff0c;血量。其次我们的英雄还会有武器。武器上有一些加成属性&#xff0c;可以…

使用mp4v2将aac音频h264视频数据封装成mp4开发心得

这阵子在捣鼓一个将游戏视频打包成本地可播放文件的模块。开始使用avi作为容器&#xff0c;弄了半天无奈avi对aac的支持实在有限&#xff0c;在播放时音视频时无法完美同步。 关于这点avi文档中有提到&#xff1a; For AAC, one RAW AAC frame usually spans over 1024 samples…

c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)

什么叫泛型编程&#xff1f;1. 参数类型化。 2. 模板 模板概念 c提供了函数模板&#xff0c;所谓函数模板&#xff0c;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体制定&#xff0c;用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同…

c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)

函数模板机制结论 编译器并不是把函数模板处理成能狗处理任何类型的函数函数模板通过具体类型产生不同的函数编译器会对函数模板进行两次编译&#xff0c;在声明的地方对模板代码的本身进行编译&#xff0c;在调用的地方对参数替换后代码进行编译在编译器编译阶段&#xff0c;…

arm-linux 交叉编译 mp4v2

2014-09-23 14:44 1901人阅读 评论(0) 收藏 举报 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 1、下载mp4v2的源代码&#xff08;http://code.google.com/p/mp4v2/downloads/list&#xff09;mp4v2-2.0.0.tar.bz2 2. 进入相应目录 ./configu…

c++模板---3(类模板碰到继承问题,类模板类外实现,类模板与友元函数)

类模板碰到继承问题 基类如果是模板类&#xff0c;必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉&#xff0c;那么无法分配内存&#xff0c;编译不过 利用参数列表class Child :public Base<int> #include<iostream>using namespace std;template&l…

Linux USB札记

嵌入式linux内核添加USB模块&#xff08;U盘&#xff09;支持 使用menuconfig工具进行配置 1、Device Drivers->SCSI device support->SCSI disk support此选项必须勾选 2、Device Drivers->USB support->Support for Host-side USB 此选项选中后会出现子菜单&…

c++实现任意类型数组类的封装

MyArray.hpp #pragma once #include<iostream> #include<string> using namespace std; template<class T>class MyArray { public://构造explicit MyArray(int capacity) //防止隐式类型转换&#xff0c;防止MyArray arr 10{this->m_Capacity capacity…

Linux内核配置选项 (经典学习)

转载地址http://book.csdn.net/bookfiles/972/10097230254.shtml 2.5 Linux内核配置选项 下面以最新的Linux 2.6.20内核为例&#xff0c;介绍比较常用的一些Linux内核配置选项&#xff0c;其他选项读者可以参考系统提供的帮助信息。 需要说明的是&#xff0c;在内核配置中&am…

深入理解linux系统下proc文件系统内容

另外&#xff0c;可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要&#xff1a;Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。 Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。与其它常见…

c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)

异常基本概念 异常处理就是处理程序中的错误&#xff0c;所谓错误是指在程序运行的过程中发生的一些异常事件&#xff08;如&#xff1a;除0退出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在&#xff0c;空指针&#xff0c;内存不足等等&#xff09; c语言中处…

RGB、YUV和YCbCr

之前对RGB、YUV和YCbCr一直没有清晰的理解和认识&#xff0c;今天打算做一个小结&#xff0c;结合网上的文章谈谈自己的看法&#xff0c;也希望有机会看到这篇文章的人能指点一二&#xff0c;相互交流&#xff0c;共同进步。 首先要说明&#xff0c;上述的RGB、YUV和YCbCr都是人…

c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)

异常接口声明 为了加强程序的可读性&#xff0c;可以在函数声明中列出可能抛出异常的所有类型&#xff0c;例如&#xff1a;void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类的异常如果在函数声明中没有包含异常接口声明&#xff0c;则此函数可以抛任何…

c++中的异常---3(系统标准异常库,编写自己异常类)

系统标准异常库 #incldue out_of_range 等… #include<iostream>#include<string>using namespace std;//系统提供标准异常#include<stdexcept>class Person{public:Person(string name, int age){this->m_Name name;//年龄做检测if (age<0 || age&g…

H.264中IDR帧和I帧区别

IDR&#xff08;Instantaneous Decoding Refresh&#xff09;--即时解码刷新。I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便&#xff0c;要首个I帧和其他I帧区别开&#xff0c;所以才把第一个首个I帧叫IDR&#xff0c;这样就方便控制编码和解码…

c++中的IO流(流的概念和流类库的结构,标准的输入输出流)

流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送给输出文件 c输入输出包含以下三个方面的内容 对系统指定的标准设备的输入输出。即从键盘输入数据&#xff0c;输出到显示器屏幕&#xff0c;这种输入输出称…

MTD应用学习札记

今天做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具&#xff0c;在进行方案验证的时候&#xff0c;遭遇到各种不解和疑惑&#xff0c;因对MTD的原理不熟悉&#xff0c;所以只能多次尝试&#xff0c;虽然最后把方案搞定了&#xff0c;不过觉得MTD中的mtd和mtdb…