C++中的抽象概念详解

本文转自:
c++中的抽象概念详解

一、定义.

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的, 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 。纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。

virtual void funtion1()=0

二、引入原因:

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数,则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。

三、相似概念:

1、多态性

指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。

a.编译时多态性:通过重载函数实现

b 运行时多态性:通过虚函数实现。

2、虚函数

虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载

3、抽象类

包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

四、程序

基类:

class A
{public:
A();
void f1();
virtual void f2();
virtual void f3()=0;
virtual ~A();};子类:
class B : public A
{public:
B();
void f1();
void f2();
void f3();
virtual ~B();};
主函数:
int main(int argc, char* argv[])
{A *m_j=new B();
m_j->f1();
m_j->f2();
m_j->f3();
delete m_j;
return 0;
}

程序解释:

f1()是一个普通的重载.

调用m_j->f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.

也就是根据它是由A类定义的,这样就调用这个类的函数.

f2()是虚函数.

调用m_j->f2();会调用m_j中到底保存的对象中,对应的这个函数.这是由于new的B

对象.

f3()与f2()一样,只是在基类中不需要写函数实现.

五、总结

   抽象就是把有共同属性或方法的抽象成一个类实现不了自己定义的接口(纯虚函数)就是抽象类。反过来想。如:我们定义了动物的类,属性是有嘴,方法是 吃。我们没有定义吃的具体实现。在派生类 老虎里 定义了 吃的 具体实现  吃肉,派生类 牛 里定义了 吃 的 具体实现 吃草,这就说明动物这个类 是抽象类,决定不了吃的具体实现,必须实现了吃 这个接口的类才不是抽象的类。如果实现了 吃的方法,那动物这个类就不能就不能通过接口说明 它是个抽象类。定义纯虚函数就是把派生类里的共同的方法抽象出来放到基类里,但并没有具体实现(描述)(因为是抽象的无法具体描述对象),派生类里对这些共同的方法来描述。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。把’吃肉‘,’吃草‘的共同方法’吃‘提取出来,那么动物就是抽象类。将函数定义为纯虚函数能够说明,该函数为后代类型提供了可以覆盖的接口,但是这个类中的版本决不会调用。为什么说只要拥有纯虚函数的类就是抽象类?派生类能够描述对象的信息,而基类类却不能描述此类对象的信息(即纯虚函数),就是抽象类。抽象类定义是对象有共同属性或方法抽象成一个类,但无法描述具体的对象(肯定无法描述),它是不存在的首先基类里 存在着派生类的 共同的属性 方法,但是如果是虚函数的话,基类的方法就和派生不一样了,因为虚函数是动态绑定,它改写基类的虚函数后,就与基类的实现不同了,这样基类就没有提取派生类的共同方法,基类也不是抽象类。如果定义为纯虚函数,则基类的纯虚函数就是个接口,纯虚函数不能被调用,它的存在只是为了在派生类中重新定义。通过纯虚函数的定义来确定抽象类以区别具体类。(同样的方法因为派生类能够调用而基类不能调用,所以是抽象类)抽象类也就是无法实例化。

C++中的抽象概念详解相关推荐

  1. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  2. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  3. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  4. BlockChain:BlockChain周边概念详解+个人理解

    BlockChain:BlockChain周边概念详解+个人理解 目录 1.拜占庭将军问题 2.共识机制 1.区块链的共识机制目前有以下几种 PoW PoS DPoS 其他共识机制 1.拜占庭将军问题 ...

  5. [crypto]-02-非对称加解密RSA原理概念详解

    说明:本文使用的数据来自网络,重复的太多了,也不知道哪篇是原创. 算法原理介绍 step 说明 描述 备注 1 找出质数 P .Q - 2 计算公共模数 N = P * Q - 3 欧拉函数 φ(N) ...

  6. [crypto]-01-对称加解密AES原理概念详解

    1.对称加解密 术语:P是明文,C是密文,K是密钥,E是加密算法,D是解密算 (1).常用的对称加解密有哪些? (2).加解密的模式 [ecb]这种模式是将整个明文分成若干段相同的小段,然后对每一小段 ...

  7. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  8. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  9. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  10. python数据处理常用函数_pytorch中的自定义数据处理详解

    pytorch在数据中采用Dataset的数据保存方式,需要继承data.Dataset类,如果需要自己处理数据的话,需要实现两个基本方法. :.getitem:返回一条数据或者一个样本,obj[in ...

最新文章

  1. AI“生死”落地:谁有资格入选AI Top 30+案例?
  2. java web常用权限方式,java web项目的几种权限控制方法
  3. VS2010与.NET4系列 5.代码优化的Web开发轮廓
  4. 数据结构与算法JavaScript描述——使用队列
  5. php验证安全码,PHP 高自定义性安全验证码的简单示例
  6. OSI网络七层模型简明教程
  7. java-io之RandomAccessFile
  8. 详解MySQL基准测试和sysbench工具
  9. Controller中目标场景及手工场景
  10. xml和html是兄弟还是父子?
  11. 网站性能测试工具Apache Benchmark的使用说明
  12. java中怎么创建单列模式,java中的3种方式创建的单例模式
  13. 华为ospf配置命令_教你使用华为Ensp模拟器配置OSPF路由协议(一)
  14. 监听程序当前无法识别连接描述符中请求的服务_Linux I/O复用中select poll epoll模型的介绍及其优缺点的比较...
  15. POJ1436Horizontally Visible Segments线段树+lazy
  16. mysql的join查询和多次查询比较
  17. sap crm行业解决方案_培训机构行业crm系统解决方案
  18. Python编程:从入门到实践(基础知识)
  19. 呀,葵花宝典![IT项目经理成长晋升记2]
  20. css 从右到左滚动,CSS 文字从左到右滚动 (右进左出)

热门文章

  1. cocos creator后台切入切出
  2. 如何在Mac上清理磁盘空间?
  3. 红胖子创业一年整总结:前二十年题记,萌芽初期,外包初期,创业初期,未来规划
  4. Snagit 2019 快速截图
  5. Hadoop-HDFS可靠性
  6. charles 请求出现乱码_解决Charles抓取https报文乱码问题
  7. python 进行照片分类_python 照片文件名分类
  8. 【硬刚大数据】从零到大数据专家之Apache Doris篇
  9. 微信小程序打开手机的手电筒
  10. cad剖切线的快捷键_CAD有哪些常用的快捷键?