C++面向对象总结——抽象类(接口)
引言
在讲解抽象类之前,我们需要回顾一下什么是纯虚函数:
纯虚函数是指对于一个虚函数,只有声明,而其函数体=0。因此,纯虚函数不需要实现,由子类继承后在子类中实现其具体功能。
抽象类
抽象类,又称抽象基类,是指拥有纯虚函数的类,抽象类只能作为基类,不能构建对象,因为抽象类中的纯虚函数没有函数体
如果在程序中对抽象基类构建对象(实例化),那么则会出现报错,具体为下面的示例:
class CBase{ public: virtual void VirtualFunction()=0; }; int main(){ CBase cb;//会报错 return 0; }
但是可以声明抽象类的对象指针:
CBase *ptr;
抽象类有子类的时候,除非子类采用具体的方法替代抽象类中的全部抽象方法(即重写全部纯虚函数),否则子类本身也会自动得认为是抽象类。
设计抽象类(通常称为 ABC)的目的,是为了提供不同种类的子类对象的一个通用接口,用比较通俗的话来说就是基类声明,子类实现,因此子类如果需要创建对象,就必须实现基类中所有的纯虚函数,否则子类依然是一个抽象类,编译器同样会报错。
这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。
实例:
#include <iostream> using namespace std; // 基类 class Shape { public: // 提供接口框架和纯虚函数 virtual int getArea() = 0; void setParameter(int w,int h) { width = w; 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.setParameter(10, 5); cout << "矩形对象的面积为" << Rect.getArea() << endl; Tri.setParameter(10, 5); cout << "三角形对象的面积为" << Tri.getArea() << endl; return 0; }
从上面的实例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。
个人理解:设置抽象类(接口)就是为了方便后面的子类多态性操作。(可以在接口上魔改)
设计策略
面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。
转载博文:(2条消息) C++学习笔记6:抽象类(接口)_小小羊-CSDN博客