C++多态、虚函数、纯虚函数、抽象类
多态
同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态。
两种多态:
(1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数。
(2)动态多态(简称多态):运行时系统根据基类指针或引用的指向,才能知道调用哪个对象里的虚函数实现。
动态多态是通过虚函数实现的,针对的也是虚函数。
实现了从是谁调用谁到指向谁调用谁的重大转变。
这是析构函数声明为虚函数的原因,可以防止delete基类指针时,只调用基类析构函数造成的内存泄露。
虚函数
虚函数的作用:在基类中声明虚函数后,可以在派生类中重新定义与基类声明完全相同的函数(非虚函数也可以-同名覆盖),
进而可以通过基类指针或引用来基类或派生类中的同名函数(非虚函数不可以-调用基类函数需加::符),从而实现多态。
虚函数的特点:
当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
派生类重新声明该虚函数时,可以省略virtual,但习惯上都加。
声明虚函数的限制:
(1)static成员函数不能是虚函数,因为静态成员函数不受限于某个对象,没有多态性的特征。
(2)inline成员函数不能声明为虚函数。因为内联函数的执行代码明确的,没有多态性的特征。
(3)构造函数不能是虚函数。因为构造函数在对象创建时调用,完成对象的初始化,此时对象还没有完全建立,更谈不上函数与类对象的绑定。
虚函数表:
------
纯虚函数
纯虚函数的声明:virtual 函数类型 函数名(参数列表)=0;
基类声明纯虚函数的原因:纯虚函数与虚函数不同的时,声明为纯虚函数的虚函数在基类中不使用,只是保留一个接口,具体功能交给派生类去定义。
例如:点->圆->圆柱三个派系类中的求面积函数,对于基类点就是不会被使用的。
抽象类
两种抽象类:
(1)凡是包含纯虚函数的类都是抽象类。
(2)没有对所有纯虚函数定义的派生类也是抽象类。
抽象类的特点:
不能定义对象(因为纯虚函数不能被调用),但可以定义指针。
抽象类的作用:
常用作基类,为一个类族提供公共接口。
C++多态、虚函数、纯虚函数、抽象类的更多相关文章
- 虚函数&纯虚函数&抽象类&虚继承
C++ 虚函数&纯虚函数&抽象类&接口&虚基类 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...
- 【转】C++ 虚函数&纯虚函数&抽象类&接口&虚基类
1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型 ...
- C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)
http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多 ...
- C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则
1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- C++学习基础十二——纯虚函数与抽象类
一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...
- c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解
静态多态.动态多态 静态多态:程序在编译阶段就可以确定调用哪个函数.这种情况叫做静态多态.比如重载,编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数.动态多态:在运行期间才可以确定最终调用的 ...
- c++,纯虚函数与抽象类
1.纯虚函数的定义: (1)虚函数被“初始化”为0的函数.声明纯虚函数的一般形式是virtual 函数类型 函数名(参数表列) =0;(2)纯虚函数没有函数体:(3)最后面的“=0”并不表示函数返回值 ...
随机推荐
- 对protected函数的简单理解 good
对于protected提供的函数和属性,除非想扩充这个类的功能,否则是完全用不到的.外部函数main()永远只能调用public的那些函数.所以从拖拉控件编程的角度来讲,只需要学习public的函数和 ...
- NOIP2018酱油记
考完了,终于有时间来写游记了. 有一种悲伤,叫做知道正解是什么但是就是不会写... 有一种遗憾,叫做能拿到的分考完才意识到... 有一种$NOIP$,叫做$Day1$原题大赛,$Day2AHOI$.. ...
- SSD(Single Shot MultiBox Detector)二读paper
SSD KeyWords:Real-time Object Detection; Convolutional Neural Network Introduction 目前最尖端(State-of-ar ...
- Linux的进程/线程通信方式总结(转)
Linux系统中的进程通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通 ...
- go——字典
Go中字典类型是散列表(hash table)的一个实现,其官方称谓是map.散列表是一个实现了关联数组的数据结构,关联数组是用于表示键值对的无序集合的一种抽象数据类型.Go中称键值对为键-元素对,它 ...
- js, 树状菜单隐藏显示
js写的不是很严谨~~~嘿嘿 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 在python中如何使用多进制数字
我们在python中,除十进制外还可以使用二进制.八进制和十六进制 1.二进制数字由0和1组成,我们使用0b或0B前缀表示二进制数 2.使用bin()函数将一个数字转换为它的二进制形式 print(b ...
- c3p0连接不上sql server
1.首先判断sqlserver是否安装成功 2如果sqlserver正常运行 可能是因为没有打开1433端口,按以下步骤设置tcp/ip enabled 打开之后再重新启动sql server服务,按 ...
- vue-cli的utils.js文件详解
转载自:http://www.cnblogs.com/ye-hcj/p/7078047.html utils.js文件 // 引入nodejs路径模块var path = require('path' ...
- ThinkPHP框架基础知识二
一.空操作和空控制器处理 空操作:没有指定的操作方法:空控制器:没有指定控制器,例如: http://网址/index.php/Home/Main/login 正常 http://网址/index. ...