> 文章列表 > C++基础知识【7】抽象类和接口

C++基础知识【7】抽象类和接口

C++基础知识【7】抽象类和接口

目录

零、引言

一、什么是抽象类

二、什么是接口

三、抽象类和接口的区别

四、应用场景


零、引言

        C++中的抽象类和接口都是用于实现面向对象编程中的多态性,即允许不同的对象以相同的方式进行处理。虽然它们的目的相同,但是它们之间还是有一些区别。

一、什么是抽象类?

        抽象类是一种特殊的类,它不能被直接实例化,只能作为基类来派生新的类。抽象类通常用来定义一组接口方法,但是这些方法并没有实际的实现。它们的实现是由派生类来完成的。

在C++中,抽象类通常包含至少一个纯虚函数。纯虚函数是一种特殊的虚函数,它没有实际的实现,只是用来定义接口。如果一个类中包含了纯虚函数,那么这个类就成为了抽象类。

抽象类的语法如下:    

class Base {
public:virtual void foo() = 0;  // 纯虚函数
};

        注意到,纯虚函数在声明时以 "=0" 结尾,这表示它是一个纯虚函数,没有实际的实现。任何继承自抽象类的派生类,都必须实现基类中的所有纯虚函数,否则这个派生类也将成为抽象类。

下面是一个抽象类的例子:

class Shape {
public:virtual void draw() = 0; // 纯虚函数virtual double area() { return 0.0; } // 虚函数,提供默认实现void setColor(const string& color) { m_color = color; } // 非虚函数
private:string m_color;
};

        在上面的例子中,Shape 类包含了一个纯虚函数 draw() 和一个虚函数 area(),同时还包含了一个非虚函数 setColor()。由于 Shape 类中包含了纯虚函数,因此它是一个抽象类,不能被实例化。

        抽象类不能定义对象,但是抽象类可以定义指针。

二、什么是接口?

        接口是一组规范的行为,它可以被多个类实现,从而实现多态性。在C++中,接口通常通过定义纯虚函数来实现。

        和抽象类不同,接口只包含纯虚函数,没有任何数据成员。接口的主要目的是为实现某个具体功能提供一组规范的接口,这样就可以在不同的实现中使用相同的接口来处理数据。

接口的语法如下:

class Interface {
public:virtual void foo() = 0;  // 纯虚函数
};

下面是一个接口的例子:

class Drawable {
public:virtual void draw() = 0; // 纯虚函数
};

        在上面的例子中,Drawable 类只包含了一个纯虚函数 draw(),它没有任何成员变量和成员函数的实现。派生类必须实现 draw() 函数,否则也会变成一个抽象类。

三、抽象类和接口的区别

抽象类和接口的区别在于:

1、抽象类可以包含成员变量和成员函数,并可以提供一些默认实现,而接口只包含纯虚函数,没有任何成员变量和成员函数的实现。

2、抽象类可以用作其他类的基类,而接口只能用于描述类的行为。

3、派生类必须实现接口中的所有函数,否则也会成为一个抽象类,而抽象类中可以有一些非纯虚函数不需要派生类实现。

四、应用场景

        在实际应用中,抽象类和接口通常用于不同的情况。抽象类用于描述一组相关的类,其中包含一些公共的成员变量和成员函数,而接口用于描述一组相关的行为,其中包含一组规范的函数集合。

        举例来说,假设我们要实现一个图形绘制程序,其中包含多种形状,例如圆形、矩形、三角形等。这些形状都具有一些共同的属性,例如颜色、位置等,因此可以将它们抽象为一个抽象类 Shape,其中包含一些公共的成员变量和成员函数。然后可以派生出具体的形状类,例如 Circle、Rectangle、Triangle 等,这些派生类必须实现 Shape 类中的纯虚函数 draw(),从而实现绘制具体的形状。

        另外,可以定义一个接口 Drawable,用于描述所有可绘制的对象,其中包含一个纯虚函数 draw()。然后可以让所有实现 Drawable 接口的类都可以被绘制。例如,如果我们还要实现一个文本框控件,它也可以实现 Drawable 接口,从而可以被绘制。