• 2024 年 12 月 23 日

C++入门学习笔记6:抽象类(接口)

纯虚函数与抽象类

纯虚函数

在之前的笔记中我们认识了虚函数,那么什么是纯虚函数呢?

纯虚函数是指对于一个虚函数只有声明而其函数体=0。因此,纯虚函数不需要实现,由子类继承后在子类中实现其具体功能。

抽象类

抽象类,又称抽象基类,是指拥有纯虚函数的类,抽象类只能作为基类,不能构建对象,因为抽象类中的纯虚函数没有函数体。

如果在程序中对抽象基类构建对象,那么则会出现报错,具体为下面的示例:

#include <iostream>
using namespace std;

class CBase{
    public:
    virtual void SomeVirtualFunction()=0;

};

int main(){
    CBase cb;
    return 0;
}

在终端中输入编译指令则会出现以下报错:

.\virtual.cpp:11:11: error: cannot declare variable 'cb' to be of abstract type 'CBase'
     CBase cb;
           ^~
.\virtual.cpp:4:7: note:   because the following virtual functions are pure within 'CBase':
 class CBase{
       ^~~~~
.\virtual.cpp:6:18: note:      'virtual void CBase::SomeVirtualFunction()'
     virtual void SomeVirtualFunction()=0;
                  ^~~~~~~~~~~~~~~~~~~

可以看出编译器提示不能实例化抽象类。

既然如此,抽象类的纯虚函数有什么作用呢?

抽象类实质上提供了不同种类的子类对象一个通用接口,用比较通俗的话来说就是基类声明,子类实现,因此子类如果需要创建对象,就必须实现基类中所有的纯虚函数,否则子类依然是一个抽象类,编译器同样会报错。

这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

示例

#include <iostream>
using namespace std;

// 基类
class Shape{
    public:
    // 提供接口框架和纯虚函数
    virtual int getArea() = 0;
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }

    protected:
    int width;
    int height;

};

// 派生类:矩形
class Rectangle: public Shape {
    public:
    int getArea() {
        return (width * height);
    }
};

// 派生类:三角形
class Triangle: public Shape {
    public:
    int getArea() {
        return (width * height)/2;
    }
};

int main(){
    Rectangle Rect;
    Triangle Tri;

    Rect.setWidth(10);
    Rect.setHeight(20);
    cout<< "矩形对象的面积为" <<Rect.getArea()<<endl;

    Tri.setWidth(10);
    Tri.setHeight(20);
    cout <<"三角形对象的面积为"<< Tri.getArea()<< endl;

    return 0;
}

调试结果为:

矩形对象的面积为200
三角形对象的面积为100

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注