一、抽象类学习笔记

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. dns资源记录类型

    资源记录的定义格式: 语法:name [TTL] IN RR_TYPE value SOA: name:当前区域的名字,例如"magedu.com.",或者"2.168. ...

  2. 深入理解java虚拟机---虚拟机工具jmap(十六)

    原文: https://www.cnblogs.com/myna/p/7573843.html jmap JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用 ...

  3. GDI中StretchBlt或Blt缩放图片失真问题

    在用Scrollview控件的缩放图片时,严重失真: 解决方法:dc.SetStretchBltMode(COLORONCOLOR). 参考文章:https://blog.csdn.net/m3728 ...

  4. SQL-39 使用索引

    题目描述 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引.CREATE TABLE `salaries` (`emp_no` int( ...

  5. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  6. javascript性能优化之避免重复工作

    javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作.第一部分可以通过代码重构完成,第二部分不做重复的工作有时候难 ...

  7. 你知道怎么用Idea抽取方法、创建class吗?

    liJ IDEA的快捷键是进行重构的利器,坊间盛传,完全使用IDEA快捷键重构的代码,是不需要写测试用例保护的 本文就分享一个使用IDEA抽取方法及创建新的class的方法 工具/原料   Intel ...

  8. nwjs 解决手指可滑动问题

    package.json 中添加: "chromium-args": "--touch-events --enable-touch-drag-drop",

  9. Redis开机自启动

    1.新建redis文件 vi /etc/init.d/redis 2.修改/tec/init.d/redis文件,要修改Redis安装目录及配置文件路径 EXEC=/usr/local/redis/b ...

  10. SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)

    开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...