一、抽象类学习笔记

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++中的抽象类的更多相关文章

  1. 第52课 C++中的抽象类和接口

    1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积. (3)Shape只是一个概念上的类型,没有具体对象 2. 面 ...

  2. C#中实现抽象类里建立静态方法

    这篇文章主要介绍了C#中实现抽象类里建立静态方法,需要的朋友可以参考下   本文简述了C#中实现抽象类里建立静态方法的解决办法,示例程序如下: 1 2 3 4 5 6 public class Tes ...

  3. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  4. java中的抽象类和抽象方法

    知识点:java中的抽象类和抽象方法 关键字abstract意为抽象的,可以用来修饰类和方法,分别称作抽象类和抽象方法 抽象类一般在多态的场景中使用 一:抽象类(abstract class) 在类的 ...

  5. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  6. 关于在C#中对抽象类的理解

    先说一下自己对类的理解吧.类就是指将一系列具有一些共同特性的事物归纳起来,按照不同的特性分为不同的类.比如在现实世界中人是一类,动物是一类.植物 又是一类.但他们都是生命这一类的派生类.他们都继承了生 ...

  7. C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )

    你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )   一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...

  8. C++中的抽象类和接口

    1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念: 2,什么是抽象类: 1,面向对象中的抽象(其实就是分类)概念: 1,在进行面向对象分析时 ...

  9. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  10. 详解Java中的抽象类和抽象方法

    引言 如上图,二维图形类有三个子类,分别是正方形类,三角形类,圆形类: 我们都知道要求正方形的面积,直接使用面积公式边长的平方即可,同理三角形的是底乘高除以2,圆的面积是$\pi$乘以半径的平方.那么 ...

随机推荐

  1. Java基础-常用工具类(一)

    object类 Object 类是所有类的的父类,如果一个类没有明确使用EXPENTS关键字明确标识继承另外一个类,那么这个类默认继承object类,oject类中的方法适合所有子类 1)toStri ...

  2. nginx保持会话的方式

    1)ip_hash 简单易用,但是有如下缺点 后端服务器宕机后,session会丢失 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡 不适用CDN网络,不适用于前段还有代理的情况 ...

  3. DHCP服务配置

    DHCP(Dynamic Host Configuration Protocol)动态主机配置协议 -->是由Internet工作任务小组设计开发的,专用于对TCP/IP网络中的计算机自定分配T ...

  4. Vue.js 2.0生命周期

    1.beforeCreate 组建实例刚被创建,属性和方法等都还没有 2.created         实例已经创建完成,属性已经绑定 3.beforeMount  模板编译之前 4.mounted ...

  5. 性能测试-10.数据分析Analysis

    Analysis Summary 平均响应时间(Average TransactionResponse Time) 每秒响应数(Transactions per Second) 1.Vuser  Ru ...

  6. 【Python】Excel操作-2 (07版本以下Excel操作,其实不怎么用了,麻蛋,预习了2天课间才发现,还说怎么跟老师讲的不一样)

    #保存修改Excel import xlrd from xlutils.copy import copy #打开Excel文档并将内容读取到内存 readbook=xlrd.open_workbook ...

  7. 三层交换机实现VLAN间通信

    实验要求:使用三层交换机,让同一vlan的主机能通信,不同vlan的主机也能通信 拓扑如下: 涉及内容: 1.VTP的创建和配置 2.vlan的创建和划分 3.三层交换机的配置 4.端口的trunk模 ...

  8. React native Configuration with name 'default' not found.

    添加插件后出现异常 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring ...

  9. Wget用法、参数解释的比较好的一个文章

    wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行.这意味这你可以登录系统,启 ...

  10. 如何让jpa 持久化时不校验指定字段

    源文:https://www.toocruel.net/jpa-validate/ 怎么让jpa 持久化时不校验指定字段 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥 ...