c++-纯虚函数和抽象类
纯虚函数和抽象类
- C面向接口编程和C多态
- 函数类型语法基础
- 函数指针做函数参数(回调函数)思想剖析
- 函数指针做函数参数两种用法(正向调用、反向调用)
- 纯虚函数 抽象类
- 抽象类基本概念
- 抽象类在多继承中的应用
- 面向抽象类编程案例强化
- C面向接口编程和C多态
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//图形类
//如果说一个类 拥有一个纯虚函数
//就称这个类是一个抽象类。
//不管这个类中有没有成员属性,只要这个类有纯虚函数,就是一个抽象类, 抽象类就是不能够实例化的。
class Shape
{
public:
//求图形面积的方法
//表示图形类声明一个方法getArea(),它是一个纯虚函数,没有函数的实现。
virtual double getArea() = 0;
};
//三角形
class Tri :public Shape
{
public:
Tri(int a, int h)
{
this->a = a;
this->h = h;
}
virtual double getArea() {
cout << "三角形求面价" << endl;
return 0.5*a*h;
}
private:
int a;
int h;
};
//正方形:
//如果说一个普通类,继承拥有纯虚函数的类,如果说不重写纯虚函数,依然是一个抽象类。
//依然不能被实例化, 如果想实例化, 必须要重写这个父类中所有纯虚函数
class Rect : public Shape
{
public:
Rect(int a) {
this->a = a;
}
virtual double getArea() {
cout << "正方形求面积" << endl;
return a*a;
}
private:
int a;//正方形边长
};
class Circle :public Shape
{
public:
Circle(int r)
{
this->r = r;
}
virtual double getArea()
{
cout << "圆形求面积" << endl;
return 3.14*r * 4;
}
private:
int r;
};
//面向抽象类写一个架构函数
void printArea(Shape *sp)
{
sp->getArea();
}
//业务层 面向的抽象类编程
int main(void)
{
//main 中所有使用的变量类型 都是 抽象类Shape的类型。
Shape *sp1 = new Rect(10);
//sp1->getArea();
Shape *sp2 = new Circle(20);
//sp2->getArea();
Shape *sp3 = new Tri(10, 20);
//sp3->getArea();
printArea(sp1);
printArea(sp2);
printArea(sp3);
return 0;
}
上一个知识的小练习
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//大哥的虚衔
class BigBrother
{
public:
//会打人。
virtual void fightPeople() = 0;
};
//东方不败
class EastNeverLose :public BigBrother
{
public:
virtual void fightPeople() {
cout << "使用了葵花宝典区打人" << endl;
}
};
//无崖子
class Wuyazi :public BigBrother
{
public:
virtual void fightPeople() {
cout << "使用北冥神功打人" << endl;
}
};
//boss
int main(void)
{
BigBrother *bigbrother = new Wuyazi;
//大哥你给我去打人。
bigbrother->fightPeople();
delete bigbrother;
return 0;
}
纯虚函数和多继承
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//接口1
class Interface1
{
public:
virtual void func1(int a, int b) = 0;
virtual void func3(int a, int b) = 0;
};
//接口2
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 func3(int a, int b) {
cout << "func3" << endl;
}
virtual void func2(int a)
{
cout << "func2 " << endl;
}
};
int main(void)
{
Interface1 *if1 = new Child;
if1->func1(10, 20);
if1->func3(100, 200);
Interface2 *if2 = new Child;
if2->func2(10);
return 0;
}
电脑组装--小练习
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//-------- 抽象层---------
//抽象CPU类
class CPU
{
public:
CPU();
virtual void caculate() = 0;
};
//抽象的card类
class Card
{
public:
virtual void display() = 0;
};
//抽象的内存类
class Memory
{
public:
virtual void storage() = 0;
};
//架构类
class Computer
{
public:
Computer(CPU *cpu, Card *card, Memory *mem)
{
this->cpu = cpu;
this->card = card;
this->mem = mem;
}
void work()
{
this->cpu->caculate();
this->card->display();
this->mem->storage();
}
~Computer() {
if (this->cpu != NULL) {
delete this->cpu;
}
if (this->card != NULL) {
delete this->card;
}
if (this->mem != NULL) {
delete this->mem;
}
}
private:
CPU* cpu;
Card*card;
Memory *mem;
};
// --------------------------
//-----------实现层----------
//具体的IntelCPU
class IntelCPU :public CPU
{
public:
virtual void caculate() {
cout << "Intel CPU开始计算了" << endl;
}
};
class IntelCard :public Card
{
public:
virtual void display() {
cout << "Intel Card开始显示了" << endl;
}
};
class IntelMem :public Memory {
public:
virtual void storage() {
cout << "Intel mem开始存储了" << endl;
}
};
class NvidiaCard :public Card
{
public:
virtual void display() {
cout << "Nvidia 显卡开始显示了" << endl;
}
};
class KingstonMem :public Memory {
public:
virtual void storage() {
cout << "KingstonMem 开始存储了" << endl;
}
};
//--------------------------
//--------业务层-------------------
int main(void)
{
//1 组装第一台intel系列的电脑
#if 0
CPU *intelCpu = new IntelCPU;
Card *intelCard = new IntelCard;
Memory *intelMem = new IntelMem;
Computer *com1 = new Computer(intelCpu, intelCard, intelMem);
com1->work();
Card *nCard = new NvidiaCard;
Memory* kMem = new KingstonMem;
Computer *com2 = new Computer(intelCpu, nCard, kMem);
com2->work();
delete intelCpu;
#endif
Computer *com1 = new Computer(new IntelCPU, new IntelCard, new IntelMem);
com1->work();
delete com1;
return 0;
}
c++-纯虚函数和抽象类的更多相关文章
- C++学习基础十二——纯虚函数与抽象类
一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...
- C++基础(纯虚函数与抽象类)
C++基础之纯虚函数与抽象类 引言 纯虚函数在C++编程中的地位很重要,其关联到了设计模式中"接口"的概念. 语法 纯虚函数的语法: 1. 将成员函数声明为virtual 2. ...
- C++:纯虚函数与抽象类
5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数 ...
- c++,纯虚函数与抽象类
1.纯虚函数的定义: (1)虚函数被“初始化”为0的函数.声明纯虚函数的一般形式是virtual 函数类型 函数名(参数表列) =0;(2)纯虚函数没有函数体:(3)最后面的“=0”并不表示函数返回值 ...
- C++复习:纯虚函数和抽象类
纯虚函数和抽象类 1基本概念 2抽象类案例 3抽象类在多继承中的应用 C++中没有Java中的接口概念,抽象类可以模拟Java中的接口类.(接口和协议) 3.1有关多继承的说明 工程上的多继承 被 ...
- 简单地说, cpp中的纯虚函数就是抽象类的具体实现
简单地说, cpp中的纯虚函数就是抽象类的具体实现.包含了纯虚函数的类就是抽象类.
- C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则
1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...
- C++开发系列-纯虚函数和抽象类
概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都实现该函数. 纯虚函数为各派生类提供了一个公共界面(接口的封装和设计.软件的模块功能的划分) 纯虚函数说明 ...
- cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech
cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech //纯虚函数是用来继承用的//纯虚函数//抽象类-抽象数据类型//*任何包含一个或者多个纯虚函数的类都是抽象类//*不要 ...
随机推荐
- 【Luogu P2002&P2341】消息扩散/受欢迎的奶牛
Luogu P2002 Luogu P2341 使用强连通分量算法缩点 第一题统计入度为0的个数强连通分量数. 第二题的答案为当且仅当仅有一个强连通分量的出度为0时该强连通分量的节点数,原因如下:若一 ...
- 【NHOI2018】扫雷完成图
[题目描述] 扫雷游戏完成后会显示一幅图,图中标示了每个格子的地雷情况.现在,一个 n * n 方阵中有 k 个地雷,请你输出它的扫雷完成图. [输入数据] 输入共 k+1 行: 第 1 行为 2 个 ...
- mysql的事物,外键,与常用引擎
### part1 时间类型 date YYYY-MM-DD 年月日 (出现日期) time HH:MM:SS 时分秒 (竞赛时间) year YYYY 年份值 (红酒年份 82年矿泉水) datet ...
- IIS部署.net core网站
1 安装 Windows8.1-KB2999226-x64 2 安装 DotNetCore.1.0.4_1.1.1-WindowsHosting http://download.microsoft ...
- HTML表格中各元素之间属性之间的相互影响
开发了一个动态表格制作程序,用的是谷歌浏览器.发现几个现象,记录如下: 1.按照技术文档的说法,正规的表格样式如下: <table> <caption>标题</capti ...
- JQuery动态添加控件并取值
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Java学习笔记(面向对象上)
面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...
- 在 Linux 部署多节点 Kubernetes 集群与 KubeSphere 容器平台
KubeSphere 是在 Kubernetes 之上构建的以应用为中心的企业级容器平台,所有供为用户提供简单易用的操作界面以及向导式操作方式.同时,KubeSphere Installer 提供了 ...
- 机器学习笔记(六) ---- 支持向量机(SVM)【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...