C++ 抽象类

  • 概述
  • 抽象类 vs 具体类
  • 案例
  • 抽象类的作用
  • 总结

概述

抽象类 (abstract class), 是一些不用来定义对象, 而只作为基类被继承的类. 由于抽象类常用作基类, 所以通常称为抽象基类 (abstract base class).


定义抽象类的唯一目的, 就是去建立派生类. 我们在抽象类基础上要定义出功能各异的派生类, 再用这些派生类去建立对象.

抽象类 vs 具体类

凡是包含纯虚函数的类都是抽象类. 纯虚函数不用实现, 故不能被调用, 抽象类无法建立对象. 抽象类的作用是作为一个类簇的共同基类, 即为一个类簇提供一个公共接口.


许多好的面向对象的系统, 其层次结构的顶部是一个抽象类, 甚至顶部有好几层都是抽象类. 如果在抽象类所派生出的新类中对基类的所有纯虚数进行了定义. 那么这些函数就被赋予了具体的功能, 可以被调用. 这个派生类就不是抽象类, 而是可以用来定义对象的具体类 (concrete class).

如果在派生类中每有对所有纯函数进行定义, 则此派生类仍然是抽象类, 不能用来定义对象.

案例

创建基类 Shape (形状), 作为抽象类. Point (点), Circle (园) 是 Shape 类的直接派生类和间接派生类, Cylinder (圆柱体) 是 Shape 的间接派生类.

Shape 类:

#ifndef PROJECT6_SHAPE_H
#define PROJECT6_SHAPE_Hclass Shape {
public:virtual double area() const {return 0.0;}virtual double volume() const {return 0.0;}virtual void shapeName() const = 0;
};#endif //PROJECT6_SHAPE_H

Point:

#ifndef PROJECT6_POINT_H
#define PROJECT6_POINT_H#include <iostream>
#include "Shape.h"
using namespace std;class Point : public Shape{
private:double a, b;
public:Point(double p1, double p2) : a(p1), b(p2) {};virtual void shapeName() const {  // 对虚函数进行再定义cout << "This is point with a = "<< a <<" b = " << b << endl;}
};#endif //PROJECT6_POINT_H

Circle:

#ifndef PROJECT6_CIRCLE_H
#define PROJECT6_CIRCLE_H#include <iostream>
#include "Shape.h"
using namespace std;class Circle : public Shape{
protected:double r;
public:Circle(double radius) : r(radius) {};virtual void shapeName() const {  // 对虚函数进行再定义cout << "This is circle with r = "<< r << endl;}
};#endif //PROJECT6_CIRCLE_H

Cylinder 类:

#ifndef PROJECT6_CYLINDER_H
#define PROJECT6_CYLINDER_H#include <iostream>
#include "Circle.h"
using namespace std;class Cylinder : public Circle{
private:double h;
public:Cylinder(double r, double height) : Circle(r), h(height) {};virtual void shapeName() const {  // 对虚函数进行再定义cout << "This is circle with r = "<< r << " h = " << h << endl << endl;}
};#endif //PROJECT6_CYLINDER_H

main:

#include <iostream>
#include "Shape.h"
#include "Point.h"
#include "Circle.h"
#include "Cylinder.h"
using namespace std;int main() {// 创建对象Point point1(1.2, 2.3);  // 点对象Circle circle1(2.5);  // 圆对象Cylinder cylinder1(3.5, 7);point1.shapeName();circle1.shapeName();cylinder1.shapeName();Shape *pt;  // 指向基类的指针pt = &point1;pt->shapeName();pt = &circle1;pt->shapeName();pt = &cylinder1;pt->shapeName();return 0;
}

输出结果:

This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7

抽象类的作用

虽然说抽象类不能定义对象, 但是可以定义指向抽象类数据的指针变量. 当派生类称为具体类之后, 就可以用这种指针指向派生类对象. 然后通过该指针调用虚函数, 实现多态性的操作.

抽象类接口是面向对象程序设计中的核心概念, 是各种设计模式中必需的机制.

总结

  • 一个基类如果包含一个或一个以上纯虚函数, 就是抽象基类
  • 抽象类不能也不必要定义对象
  • 抽象基类与普通基类不同, 它不是现实存在的对象的抽象
  • 在类的层次结构中, 顶层或最上面的几层可以是抽象基类. 抽象基类体现了类族各类的共性, 把各类中共有的成员函数集中在抽象基类中声明
  • 抽象类是类族的公共接口
  • 利用虚函数和多态性, 我们可以让执行环境处理特殊性, 减少工作量和工作难度

C++ 抽象类 (abstract class)相关推荐

  1. php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别

    /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...

  2. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  3. Python编程基础:第四十七节 抽象类Abstract Classes

    第四十七节 抽象类Abstract Classes 前言 实践 前言 抽象类可以这么理解,它就是一个模板,里面声明了子类必须定义的函数,但是对于每个函数都没有给出具体实现.所有函数的实现都是在子类中定 ...

  4. java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架, 当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  5. 小论接口(interface)和抽象类(abstract class)的区别

    接口是类实现了某一种功能的体现,这种体现往往是对外的,所以重载接口的函数一定是public的 可是初学OO编程的时候,往往会碰到一个问题,既然有接口(interface)的存在,为什么还要有抽象类(a ...

  6. 接口Interface和抽象类abstract class的区别

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  7. Java 面向对象 之 抽象类 abstract

    转载于 : http://www.verejava.com/?id=16992804621647 /**知识点: 抽象类 abstract题目: 爸爸叫我买一斤水果和一条鱼思路:1. 抽象出类:爸爸( ...

  8. C#中接口(Interface)与抽象类(abstract)的区别

    前言:在我学习接口(interface)与抽象类(abstract)时,我发现它们有一些相似之处也有一些不同,本博文来详细说说它们二者之间的区别: 文章目录: 一.不同之处: 1.声明上: 2.成员上 ...

  9. Java中抽象类 abstract和interface的区别

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  10. java抽象类关键字_Java 抽象类 abstract关键字

    抽象类前使用abstract关键字修饰,则该类为抽象类 抽象的方法是不完全的,它只是一个方法签名而完全没有方法体 抽象的方法没有花括号 继承抽象类的子类必须覆盖父类的抽象函数(即:子类继承抽象类以后, ...

最新文章

  1. List 为什么可以实例化ArrayList
  2. C语言试卷终稿,C语言试卷终稿B1.doc
  3. 入围CVPR最佳论文,这项AI基础研究让我们对虎牙刮目相看
  4. PHP从入门到跑路(一), 安装PHP环境
  5. js基础篇——localStorage使用要点
  6. D2 AJAX 封装策略
  7. 课时 15-深入解析 Linux 容器 (华敏)
  8. Nagios(页面)报错: Return code of 13 is out of bounds
  9. mysql数据库栏目_MySQL的一些小技巧(持续更新) - mysql数据库栏目
  10. mysql group 索引失效_介绍mysql索引失效的情况
  11. vmware 虚拟机中有时获取不到IP地址
  12. 前端注释那些事儿:看懂这篇,提高代码质量So easy
  13. bouncycastle JAVA实现SM3算法
  14. HCNE---succeed,HCSE---Learning!!!
  15. java计算机毕业设计水果商城设计MyBatis+系统+LW文档+源码+调试部署
  16. 机器学习(一)模型三要素
  17. 4.Java数组(一)
  18. c语言输出整数n的所有素数因子,输入一个正整数 输出它的所有质数因子的c语言程序...
  19. Linux内核调试技术指南
  20. 9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010

热门文章

  1. 以360家庭安全大脑为引擎,360IoT战略全景出炉
  2. datePicker设置时间范围
  3. VC编程Windows消息处理机制、阻塞试验、SetTimer、MessageBox、小心消息响应处理函数
  4. 3.4.7、使用 systemd 管理配置 Docker
  5. 《所谓情商高,就是会说话》全书思维导图分享
  6. 电脑如何截屏?用什么快捷键?
  7. 在线投票系统(限制IP地址,前端界面需要自己美化(很简单))
  8. 3d立方体html文件,css3 transform 3d 使用css3创建动态3d立方体(html5实践)
  9. 软开企服开源的JVS开发套件(V2.1.3)产品说明书
  10. 网络克隆实验(多播克隆)