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$乘以半径的平方.那么 ...
随机推荐
- 五. Python基础(5)--语法
五. Python基础(5)--语法 1 ● break结束的是它所在的循环体, continue是让它所在的循环体继续循环 # 打印: 1 10 2 10 3 10 4 10 5 10 6 10 7 ...
- 深入理解java虚拟机---虚拟机工具VisualVM(十九)
性能分析神器VisualVM 9602 VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成 ...
- DevExpress WPF v18.2新版亮点(一)
买 DevExpress Universal Subscription 免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...
- SharePoint Framework 构建你的第一个web部件(三)
博客地址:http://blog.csdn.net/FoxDave 本篇接上一讲,我们一起来看一下如何部署和测试本地开发的web部件. 在SharePoint中预览web部件 SharePoint ...
- JS(JQEERY) 获取JSON对象中的KEY VALUE
var json= { "Type": "Coding", "Height":100 }; for (var key in json) { ...
- Sample Credential Providers
Windows Vista Sample Credential Providers Overview Contents Terms of Use Release Notes SampleCre ...
- Vue.js与WdatePicker日历控件冲突问题的解决方案
问题:同时使用Vue.js与WdatePicker时,双向绑定的日期字段获取不到界面输入的值,而且别的字段的值改变后,日期控件的内容会被清空 原因:WdatePicker不是Vue的插件,不能响应Vu ...
- js 回车键事件
document.onkeydown = function (event) { var e = event || window.event || arguments.callee.caller.arg ...
- Python 再次改进版通过队列实现一个生产者消费者模型
import time from multiprocessing import Process,Queue #生产者 def producer(q): for i in range(10): time ...
- HDU 1213 How Many Tables(并查集裸题)
Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...