目录

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

概述

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

C/C++中抽象类详解及其作用介绍

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

抽象类 vs 具体类

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

C/C++中抽象类详解及其作用介绍

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

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

案例

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

Shape 类:

#ifndef PROJECT6_SHAPE_H
#define PROJECT6_SHAPE_H

class 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 = 7

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 = 7

抽象类的作用

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

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

总结

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。