C++中的抽象类
一、抽象类学习笔记
1.virtual修饰函数(虚函数)后面加=0就称为一个纯虚函数,一个类中只要有纯虚函数那么它就是一个抽象类。抽象类不能用来实例化对象,是用来给他的派生类定义好这些框架的,给使用这个类的程序定义好接口。
2.抽象类中可以部分是纯虚函数,部分是实现好的函数。
3.若派生类没有全部实现父类的存纯虚函数,由于继承关系,子类中也会有纯虚函数,因此子类也是抽象类,不能实例化对象。
4.多态中的两个特例在纯虚函数中是不成立的。(各自返回本对象的指针或引用、析构函数前加virtual)
5.实现为抽象类的好处:编写简单,可以防止适用此类来实例化对象。
6.抽象类界面
一个程序由多人合作编写,类编程和应用编程,目的是修改类重新生成库,但是应用程序不需要重新编译。
类编程:提供的类生成动态库
应用编程:使用动态库实现逻辑
例子中应用程序包含各个库的头文件,修改头文件就不行了,运行后程序崩溃了。
实现应用程序不包含类的头文件:
app
-------------------------------------
Human.h
-------------------------------------
Englishman Chineseman
使用这项技术把容易变化的类和应用程序隔离开了,中间引入一个相对固定的Human.h,它是一个接口是抽象类的界面。应用编程和类编程区分开来,互不影响。
7.析构函数可以定义为虚函数以达到在父类指针或引用在消除时调用子类的析构函数(然后再调用父类的析构函数)。但是析构函数不能定义为纯虚函数,因为纯虚函数就是没有实现,在链接期会报错(但是不是像普通函数一样报抽象类不能实例化对象)。
二、Demo
1.抽象类界面例子
/*main.cpp*/
#include "libhuman.h"
int main() {
Human *pe = new_english_man();
pe->eating();
pe->wearing();
delete_english_man(pe);
return ;
}
/* libhuman.h */
#ifndef _LIBHUMAN_H__
#define _LIBHUMAN_H__ #include <iostream> using namespace std; class Human {
int a;
public:
int b;
virtual void eating() = ; virtual void wearing() = ; virtual ~Human() { //shouldn't be pure virtual function
cout << "~Human()" << endl;
}
}; Human * new_english_man();
void delete_english_man(Human * ph); #endif
/* English.h */ #ifndef _ENGLISH_H__
#define _ENGLISH_H__ #include <iostream>
#include "libhuman.h" using namespace std; class English : public Human {
int a[]; //new add to test
public:
void eating();
void wearing();
~English();
}; #endif
/* English.cpp */
#include "English.h"
void English::eating() {
cout << "English::eating" << endl;
}
void English::wearing() {
cout << "English::wearing" << endl;
}
English::~English() {
cout << "English::~English" << endl;
}
Human * new_english_man() {
return new English();
}
void delete_english_man(Human * ph) {
delete static_cast<English*>(ph);
}
/* Makefile */
main : libHuman.so main.cpp
g++ $^ -o $@ -L ./ -lHuman libHuman.so : English.cpp
g++ -shared -fPIC -o $@ English.cpp clean:
rm -rf libHuman.so *.o main # export LD_LIBRARY_PATH=./ ./main
C++中的抽象类的更多相关文章
- 第52课 C++中的抽象类和接口
1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积. (3)Shape只是一个概念上的类型,没有具体对象 2. 面 ...
- C#中实现抽象类里建立静态方法
这篇文章主要介绍了C#中实现抽象类里建立静态方法,需要的朋友可以参考下 本文简述了C#中实现抽象类里建立静态方法的解决办法,示例程序如下: 1 2 3 4 5 6 public class Tes ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- java中的抽象类和抽象方法
知识点:java中的抽象类和抽象方法 关键字abstract意为抽象的,可以用来修饰类和方法,分别称作抽象类和抽象方法 抽象类一般在多态的场景中使用 一:抽象类(abstract class) 在类的 ...
- Java学习笔记二十七:Java中的抽象类
Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...
- 关于在C#中对抽象类的理解
先说一下自己对类的理解吧.类就是指将一系列具有一些共同特性的事物归纳起来,按照不同的特性分为不同的类.比如在现实世界中人是一类,动物是一类.植物 又是一类.但他们都是生命这一类的派生类.他们都继承了生 ...
- C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )
你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 ) 一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...
- C++中的抽象类和接口
1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念: 2,什么是抽象类: 1,面向对象中的抽象(其实就是分类)概念: 1,在进行面向对象分析时 ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 详解Java中的抽象类和抽象方法
引言 如上图,二维图形类有三个子类,分别是正方形类,三角形类,圆形类: 我们都知道要求正方形的面积,直接使用面积公式边长的平方即可,同理三角形的是底乘高除以2,圆的面积是$\pi$乘以半径的平方.那么 ...
随机推荐
- MATLAB图片折腾3
把视频抽帧,转化成图片 我的代码如下,成功实现clc;clear;videofilename='k:\GraduationWork\Resource\video.wmv'; %where you pu ...
- 每天CSS学习之border-spacing
border-spacing是CSS2的一个属性.其作用是规定表格的相邻单元格边框之间的距离.如果表格的border-collapse属性值为collapse时,border-spacing设置无效. ...
- Java面向对象习题
1: 抛出异常:throw声明异常:throwsthrow用于在程序中抛出异常,throws用于在方法内抛出异常.throw抛出的异常没有被处理的话必须有throws有throws ,但是不一定必须有 ...
- C++标准库头文件名字和C语言头文件名字的区别
1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...
- 小程序之setData特殊情况 三种情况的wx:if
比如data{ “a”:{}, "b":{} } 你想完成这样的结构 //创建一个对象 var readyData={} //对象[key] =另一个对象 readyData[ke ...
- String 和StringBuffer的简单实用案例
3.现在有个字符串是按照如下格式保存的:“张三:90|李四:80|王五:100” 显示后的数据如下所示,按不同的人员显示: 姓名:张三,成绩是:90: 姓名:李四,成绩是:90: 姓名:王五,成绩是: ...
- Centos7部署kubernetes API服务(四)
1.准备软件包 [root@linux-node1 bin]# pwd /usr/local/src/kubernetes/server/bin [root@linux-node1 bin]# cp ...
- Linux 配置selenium + webdriver 环境
1.ubuntu 自带了python, 可以打开终端输入python 回车后如果显示版本信息就说明已经安装 2.安装安装python setup tools apt-get install pytho ...
- Oracle function和procedure
1.返回值的区别 函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2. 调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数:一般情况下是用来计算并返回一个计算结 ...
- 解释生成器(generator)于函数的不同,并实现和使用简单generator?
生成器和函数的主要区别在于函数return avalue,生成器yield a value,同事标记或记忆point of the yield 以便在下次调用时从标记点恢复执行,yield使用函数 ...