C++基础17-纯虚函数和抽象类

总结:

1,含有纯虚函数的类,称为抽象基类,不可实列化。即不能创建对象,存在 的意义就是被继承,提供族类的公共接口。

2,纯虚函数只有声明,没有实现,被“初始化”为 0

3,如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。

1、基本概念

纯虚函数是一个在基类中说明的虚函数在基类中没有定义,要求任何派生类都定义自己的版本

    纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)

2、纯虚函数的语法

        virtual 类型 函数名(参数表) = 0;

一个具有纯虚函数的基类称为抽象类

3、C++中没有接口的概念,C++中可以使用纯虚函数实现接口

      接口类中只有函数原型定义,没有任何数据的定义.

代码示例:

01纯虚函数:
 

#if 1
#include<iostream>
using namespace std;//图形类
//如果说一个类只要有拥有纯虚函数,就称此类为抽象类。(不管这个类有没有其他数据成员)
//抽象类 不能实例化
class Shape {
public://求图形类的面积//表示图形类声明一个方法getArea(),它是一个纯虚函数。灭有函数的实现virtual double getArea() = 0;   //纯虚函数int a;int b;
};//正方形
//如果说一个普通类继承了一个抽象类,则必须重写纯虚函数。
//若不重写所有纯虚函数,则子类仍为抽象类,依然不能被实例化
//
class Rect :public Shape {
public:Rect(int a) {this->a = a;}virtual double getArea() {cout << "Rect:getArea" << endl;return a*a;}
private:int a;  //正方形边长
};//不需要关心Rect的实现
class Circle :public Shape {
public:Circle(int r) {this->r = r;}virtual double getArea() {cout << "Circle:getArea" << endl;return 3.14*a*a;}
private:int r;  //圆半径
};class Tri :public Shape {
public:Tri(int d,int h) {this->d = d;this->h = h;}virtual double getArea() {cout << "Circle:getArea" << endl;return d*h/2;}
private:int d;   //底int h;   //高
};//面向抽象类写一个架构函数
void printArea(Shape *sp) {sp->getArea();
}//业务层 面向的抽象类编程
void test01() {//main中所有使用的变量地址 都是抽象类Shape的类型//Shape s;  //编译错误 抽象类不能实例化Shape *sp1 = new Rect(3);  //父类指针指向子类对象sp1->getArea();   //多态实现Shape *sp2 = new Circle(3);  //父类指针指向子类对象sp2->getArea();Shape *sp3 = new Tri(3,3);  //父类指针指向子类对象sp3->getArea();
}
/*
Rect:getArea
Circle:getArea
Circle:getArea
*/
int main() {test01();return 0;
}
#endif

02抽象类练习:

#if 1
#include<iostream>
using namespace std;
class Boss {
public:virtual void fight() = 0;
};
class DongFangBuBai :public Boss {
public:virtual void fight() {cout << "东方不败使出了葵花宝典" << endl;}
};
class DuanYu :public Boss {
public:virtual void fight() {cout << "段誉使出了六脉神剑" << endl;}
};
class WuYaZi :public Boss {
public:virtual void fight() {cout << "无崖子使出了北冥神功" << endl;}
};
void test01() {Boss *Dong = new DongFangBuBai;Dong->fight();Boss *Duan = new DuanYu;Duan->fight();Boss *Wu = new WuYaZi;Wu->fight();delete Dong;delete Duan;delete Wu;
}
/*
东方不败使出了葵花宝典
段誉使出了六脉神剑
无崖子使出了北冥神功
*/
int main() {test01();return 0;
}
#endif

03纯虚函数和多继承练习:

#if 1
#include<iostream>
using namespace std;
class Interface1 {
public:virtual void func1(int a, int b) = 0;
};
class Interface2 {
public:virtual void func2(int a) = 0;
};
class Child :public Interface1, public Interface2 {
public:virtual void func1(int a, int b) {cout << "func1" << endl;}virtual void func2(int a) {cout << "func2" << endl;}
};
void test01() {Child d;Interface1 *if1 = new Child;if1->func1(1,2);   //只能看见func1,看不见func2
}
/*
func1
*/
int main() {test01();return 0;
}
#endif

抽象类练习2:

Animal1.h

#pragma once
#include<iostream>
using namespace std;
class Animal1
{
public:virtual void voice() = 0;Animal1();virtual ~Animal1();};//架构函数
//让动物叫
void letAnimalCry(Animal1 *animal);
void letAnimalCrys(Animal1 *animal);

Animal1.cpp

#include "Animal1.h"Animal1::Animal1()
{cout << "Animal1()" << endl;
}Animal1::~Animal1()
{cout << "~Animal1()" << endl;
}void letAnimalCrys(Animal1 * animal)
{animal->voice();delete animal;  //这里删除,调用时不必删除
}
void letAnimalCry(Animal1 *animal) {animal->voice();
}

Cat1.h

#pragma once
#include "Animal1.h"
class Cat1 :public Animal1
{
public:Cat1();~Cat1();virtual void voice();
};

Cat1.cpp

#include "Cat1.h"
Cat1::Cat1()
{cout << "Cat1()" << endl;
}Cat1::~Cat1()
{cout << "~Cat1()" << endl;
}
void Cat1::voice() {cout << "cat is crying" << endl;
}

Dog1.h

#pragma once
#include "Animal1.h"
class Dog1 :public Animal1
{
public:Dog1();~Dog1();virtual void voice();
};

Dog1.cpp

#include "Dog1.h"
Dog1::Dog1()
{cout << "Dog1()" << endl;
}Dog1::~Dog1()
{cout << "~Dog()" << endl;
}
void Dog1::voice() {cout << "dog is crying" << endl;
}

main.cpp


#include"Animal1.h"
#include"Dog1.h"
#include"Cat1.h"void test01() {Animal1 *dog = new Dog1;dog->voice();delete dog;  //如果Animal的析构函数没有声明为虚函数,运行delete不会调用子类析构函数如果Animal的析构函数声明为虚函数,运行delete会调用子类析构函数Animal1 *cat = new Cat1;cat->voice();delete cat;
}
/*
Animal1()
Dog1()
dog is crying
~Dog()
~Animal1()
Animal1()
Cat1()
cat is crying
~Cat1()
~Animal1()
*/
void test02() {Animal1 *dog = new Dog1;Animal1 *cat = new Cat1;letAnimalCry(dog);letAnimalCry(cat);delete dog;   //架构函数中未执行删除对象操作 调用时执行删除操作delete cat;  
}
/*
Animal1()
Dog1()
Animal1()
Cat1()
dog is crying
cat is crying
~Dog()
~Animal1()
~Cat1()
~Animal1()
*/
void test03() {Animal1 *dog = new Dog1;Animal1 *cat = new Cat1;letAnimalCrys(dog);//架构函数中执行删除对象操作 调用时不需要执行letAnimalCrys(cat);}
/*
Animal1()
Dog1()
Animal1()
Cat1()
dog is crying
~Dog()
~Animal1()
cat is crying
~Cat1()
~Animal1()
*/
//test03 等价于 test04
void test04() {letAnimalCrys(new Dog1);letAnimalCrys(new Cat1);
}
/*
Animal1()
Dog1()
dog is crying
~Dog()
~Animal1()
Animal1()
Cat1()
cat is crying
~Cat1()
~Animal1()
*/
int main() {//test01();cout << "-------"<<endl;//test02();cout << "-------" << endl;//test03();cout << "-------" << endl;//test04();return 0;}

 

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

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

相关文章

c语言wpf99乘法表,使用JSP输出九九乘法表

R数据实战vehicles--1新建项目vehicles-project 数据文件vehicles.csv与varlabels.txt放在项目文件中【CSS3】---颜色RGBA及渐变色颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数…

C++基础18-抽象类-电脑组装练习

01电脑组装me.cpp 需要实现所有的虚函数&#xff0c;不台灵活。架构函数无法写&#xff0c;设计不够成熟 #if 1 #include<iostream> using namespace std; class Computer { public:virtual void caculate() 0;virtual void display() 0;virtual void storage() 0; …

以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现

《数据结构C语言版 串的块链存储表示和实现》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《数据结构C语言版 串的块链存储表示和实现(13页珍藏版)》请在人人文库网上搜索。1、*数据结构C语言版 串的块链存储表示和实现P78编译环境&#xff1a;Dev-C 4.9.9.2日期&…

mysql索引创建及使用注意事项

总结&#xff1a; 1、在使用索引时&#xff0c;一般情况下不建议使用like操作。如果使用&#xff0c;则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.&#xff08;最左缀原则&#xff09; 2、单列索引的使用&#xff1a; 《1》 只…

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启&#xff0c;和平精英与刺激战场有什么不同呢&#xff1f;今天小编就为大家带来了信号值详解&#xff01;各位玩家千万不要错过呀&#xff01;信号值详解信号接收区和信号值是什么&#xff0c;对选手有什么影响&#xff1f;在游戏战斗界面中&#xff0…

c语言编程判断素数的函数,【面试题】C语言:实现一个函数,判断一个数是不是素数。...

#include#include#includeint prime(int num){int k 0;int i 0;k sqrt(num);for (i 2; i < k; i) /*不满足循环条件时即均不可被整除&#xff0c;不是素数*/{if (num%i 0){return 0;}}return -1;}int main(){int num 0;int ret 0;printf("please input the nu…

Linux命令 umask,chmod使用

一、文件权限详解 1、文件权限介绍 在linux中的每一个文件或目录都包含有访问权限&#xff0c;这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下三种访问方式限制访问权限&#xff1a;只允许用户自己访问&#xff1b;允许一个预先指定的用户组中…

python启动c语言gdb,使用gdb调试python程序

游戏服务器菜鸟之C&num;初探三游戏服务在经过上述2番折腾之后,最后决定使用TCP进行通信,所以在一次进行重构 主要重构的要点 1.将过来的HTPP请求,重构为TCP请求: 2.使用组件FluenScheduler进行怪物的定时刷新,和定时 ...Windows环境下的NodeJS&plus;NPM&plus;Bower…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…

递归题型解析

#include<iostream> using namespace std; int foo(int n) {if (n < 1)return n;return (foo(n - 1) foo(n - 2)); } int main() {printf("%d\n", foo(5));return 0; } 解析&#xff1a; foo(5)foo(4)f00(3)foo(3)foo(2)foo(3)2foo(3)foo(2)2(foo(2)foo(1…

64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

简介最近学习了一下_IO_FILE的利用&#xff0c;刚好在pwnable.tw上碰到一道相关的题目。拿来做了一下&#xff0c;遇到了一些困难&#xff0c;不过顺利解决了&#xff0c;顺便读了一波相关源码&#xff0c;对_IO_FILE有了更深的理解。文章分为三部分&#xff0c;分别是利用原理…

戴尔笔记本电脑开机黑屏怎么办_戴尔笔记本电脑充不进电怎么办

笔记本电脑电池充不进电要怎么办呢&#xff1f;笔记本电脑之所以这么受欢迎&#xff0c;是因为笔记本有配备电池&#xff0c;能够在没有电源的情况下使用五六个小时。而电池的电用光后&#xff0c;就需要进行充电。不过有些用户反映说&#xff0c;自己的电池充不进电&#xff0…

linux之trap命令

一. trap捕捉到信号之后&#xff0c;可以有三种反应方式&#xff1a;   (1)执行一段程序来处理这一信号   (2)接受信号的默认操作   (3)忽视这一信号 二. trap对上面三种方式提供了三种基本形式&#xff1a; 第一种形式的trap命令在shell接收到signal list清单中数…

IIS安装2个SSL_顶级域名0元撸-免费注册2个腾讯云域名 免费SSL证书

前言这两天折腾甜糖CDN&#xff0c;为了收益最大化申请了公网IP&#xff0c;于是顺带折腾了一下群晖外网访问。使用的DDNS方案是腾讯dnspod&#xff0c;注册一个便宜的顶级域名访问我的群晖&#xff0c;折腾过程中发现可以免费注册2个顶级域名&#xff0c;不敢独享发出来大家一…

c语言中文刷屏,c语言二维数组刷屏练习.doc

c语言二维数组刷屏练习// 二维数组的刷屏综合练习 编制于2012.9.23#include#include#include#include#define WIDTH 22//宏定义/***********************函数声明**********************************************/void init();//数组赋初值void print();//显示当前数组void mov…

三菱a系列motion软体_工控电缆如何制作?(以三菱PLC、触摸屏为例)

RS232接口的三菱Q系列PLC编程通讯电缆三菱GT11/GT15触摸屏RS232串口编程电缆三菱GT11/GT15触摸屏连接Q系列PLC电缆三菱GT11/GT15触摸屏连接FX2/FX2C/A/QnA系列PLC电缆三菱GT11/GT15 触摸屏连接FX3U/FX2N/FX1N系列PLC电缆FX2、A系列PLC到A970GOT人机介面连接电缆FX0s/FX0n/FX2n/…

c语言水仙花验证,[编程入门]水仙花数判断 (C语言代码)

解题思路:三个变量 判断一下 yes就输出注意事项:参考代码:#include using namespace std;int a[5];int used[5];int print[4];void dfs(int cur,int cont){if(cur 4){for(int i 1;i < 3;i){cout<}cout<return;}for(int i 1;i < 4;i){if(used[i] 0&&i !…

C/C++混淆点-与

简介&#xff1a; &&是逻辑与运算符&#xff0c;||是逻辑或运算符&#xff0c;都是逻辑运算符&#xff0c;两边只能是bool类型 &与| 既可以进行逻辑运算&#xff0c;又可以进行位运算&#xff0c;两边既可以是bool类型&#xff0c;又可以是数值类型 区别&#xf…

电脑入门完全自学手册_「新书推荐」新能源汽车维修完全自学手册

《新能源汽车维修完全自学手册》作者&#xff1a;广州瑞佩尔信息科技有限公司 、胡欢贵售价&#xff1a;85.00上市时间&#xff1a;2020年7月本书内容分为 8 章, 第 1 章为高压安全系统, 主要介绍了新能源汽车中高压安全防护装置构造以及维修所需的安全防护工具、 安全作业规范…

c语言 整型转bool,C语言的布尔类型(_Bool)【转】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 我们自己定义的“仿布尔型”在C99标准被支持之前&#xff0c;我们常常自己模仿定义布尔型&#xff0c;方式有很多种&#xff0c;常见的有下面两种&#xff1a;view plaincopy to clipboardprint?/* 第一种方法 */#define TRUE …