一、纯虚函数定义
纯虚函数是在抽象类中定义的一个没有实现的虚函数,需要派生类去实现。纯虚函数通过 "= 0" 来表示。
class Base { public: virtual void doSomething() = 0; };
上述代码中,doSomething函数就是一个纯虚函数。
二、抽象类
抽象类是含有纯虚函数的类,不能实例化一个抽象类对象。一个抽象类可以被用来定义接口,其他的类可以继承这个抽象类并实现这个接口。
class Shape { public: virtual void draw() = 0; }; class Circle : public Shape { public: void draw() override { // draw a circle here } }; class Square : public Shape { public: void draw() override { // draw a square here } };
上述代码中,Shape就是一个抽象类,Circle和Square是其派生类,实现了Shape定义的接口。
三、接口继承
接口是指定义的一些函数,派生类必须实现这些函数才能被视为是该接口的实现。
class Resource { public: virtual void load() = 0; virtual void save() = 0; }; class File : public Resource { public: void load() override { // load file here } void save() override { // save file here } }; class NetworkResource : public Resource { public: void load() override { // load network resource here } void save() override { // save network resource here } };
上述代码中,Resource类是一个接口,File和NetworkResource都是其派生类,实现了Resource定义的接口。
四、纯虚析构函数
在使用指针进行多态时,通常我们需要将构造函数定义为虚函数,但是析构函数同样需要这样操作。在抽象基类中定义一个纯虚析构函数来保证派生类中析构函数的正确执行。
class Base { public: virtual ~Base() = 0; }; Base::~Base() {} class Derived : public Base { public: ~Derived() override {} };
上述代码中,Base类定义了一个纯虚析构函数,Derived类是其派生类,实现了其析构函数。
五、多态性
多态性是面向对象程序设计的一个主要思想,意味着一个对象可以具有多种形态。利用纯虚函数和抽象类,可以方便地实现多态性。
void doSomething(Resource& r) { r.load(); r.save(); } int main() { File f; NetworkResource n; doSomething(f); doSomething(n); return 0; }
上述代码中,doSomething函数参数是一个Resource的引用,可以接受其派生类的对象传递。在main函数中通过调用doSomething函数实现了多态性的体现。