C++(笔记)纯虚函数(抽象类)
来源:互联网 发布:淘宝手机端怎么排名 编辑:程序博客网 时间:2024/05/15 23:43
一、纯虚函数定义
1.纯虚函数是在基类中声明的虚函数,首先最起码是在基类中的虚函数
2.纯虚函数在基类中是没有定义的,这里指基类,但任何子类中都要定义该纯虚函数的实现方法
3.在基类中实现纯虚函数的方法是虚函数原型后加“=0”,例如:
virtual void function()=0;
为什么要引入纯虚函数?
1.因为当你顶级基类A有一虚函数play();,而A的子类B也有play();,A的子类C也有play();,这就说明如果顶级基类A中的play();若定义怎么玩是不合理的。因为B有B的玩法C有C的玩法。所以这种情况下定义为纯虚函数目的在于使子类仅仅只是继承函数的接口,告诉子类的设计者“你必须在子类中提供一个纯虚函数的实现,但我不知道你会怎么样实现它”
2.引入纯虚函数,则编译器要求在子类中必须予以重写以实现多态性
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>#include <math.h>#include <cmath>#include <iostream>using namespace std;class A{public: virtual void play()=0; /*void run() { cout<<"A runing"<<endl; }*/};class B:public A{public: /*void play() { cout<<"B playing"<<endl; }*/};class C:public A{public: /*void play() { cout<<"C playing"<<endl; }*/ };int main(){ //A *a=new B; A a; a.play(); return 0;}
错误提示A是抽象类,play是纯虚函数
可以看出子类必须对纯虚函数进行实现
二、什么是抽象类
含有纯虚函数的类称为抽象类,它不能生成对象,而且只能是基类
抽象类为什么不能生成对象?
因为抽象类声明了纯虚函数,所以用户不能创建类的纯虚函数实例,只能创建它的派生类的实例
抽象类的作用
将有关的操作作为结果接口组织在一个继承层次结构中,由它为子类提供一个公共的根,子类将具体实现在其基类中作为接口的操作。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>#include <math.h>#include <cmath>#include <iostream>using namespace std;class A{public: virtual void play()=0; void run() { cout<<"A runing"<<endl; }};class B:public A{public: void play() { cout<<"B playing"<<endl; }};class C:public A{public: void play() { cout<<"C playing"<<endl; }};int main(){ A *b=new B; b->play(); A *c=new C; c->play(); return 0;}
三、归纳ING
1.纯虚函数没有定义
2.纯虚函数是用来规范子类的行为,即接口
3.抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用
4.定义纯虚函数就是为了让基类不能实例化,因为实例化并没有意义
5.纯虚函数的引入更加安全:因为它避免了不小心没有去实现的问题,它会提醒子类去做相应的实现
6.纯虚函数的引入更加有效率:编码的效率会提升!
- C++(笔记)纯虚函数(抽象类)
- 纯虚函数(抽象类)
- 【c++】纯虚函数和抽象类
- C++:纯虚函数与抽象类
- [C++]纯虚函数和抽象类
- MFC学习笔记(一)之虚函数、纯虚函数、抽象类
- C++ 抽象类(虚函数与纯虚函数)
- c++学习笔记(十三):纯虚函数和抽象类
- C++-虚函数,多态性,纯虚函数,抽象类
- C++、JAVA与C#中的多态虚函数、纯虚函数(抽象函数)
- C++、JAVA与C#中的多态虚函数、纯虚函数(抽象函数)
- C++、JAVA与C#中的多态虚函数、纯虚函数(抽象函数)
- 多态性(纯虚函数与抽象类)
- c++中的抽象类(纯虚函数)
- c++知识点----定义抽象基类(纯虚函数)
- 白话C++系列(纯虚函数和抽象类)
- 纯虚函数 抽象类
- 纯虚函数,抽象类
- JNI ERROR (app bug): local reference table overflow (max=512)
- 周志华 机器学习 模型选择与评估
- Kanzi基础---C++访问Kanzi节点
- Hibernate检索方式概述
- 如何消化一本书
- C++(笔记)纯虚函数(抽象类)
- 南阳OJ 题目98:成绩转换
- 字符串处理函数
- [LeetCode]292. Nim Game
- LeetCode#54. Spiral Matrix
- C语言排序
- javaweb项目之(书城项目)的功能实现(最全没有之一)
- Spring Boot采用JDBC方式连接数据库
- java入门系列之JDK和进制转换