21xrx.com
2024-11-22 06:35:06 Friday
登录
文章检索 我的文章 写文章
C++中纯虚函数的用途
2023-07-06 19:34:53 深夜i     --     --
纯虚函数 接口 实现多态 基类 抽象类

C++中的纯虚函数是一种特殊的虚函数,它在类中只有函数声明,没有函数定义。纯虚函数通过在基类中声明而在派生类中重新定义,来实现多态性。纯虚函数可以为一个抽象类提供公共接口,这个接口可以被不同的派生类实现,使得这些类能够具备不同的功能。

纯虚函数的用途有很多,下面列举了几个典型的例子:

1. 接口设计

在设计接口时,我们通常会使接口类成为一个抽象类,其中所有的函数都是纯虚函数。这样就可以让实现这个接口的类更新其实现,不管这个实现在内部做些什么都不会影响接口类的使用。例如:


class IShape

{

 public:

  virtual ~IShape() = default;

  virtual double Area() const = 0;

  virtual double Perimeter() const = 0;

};

这个接口类IShape定义了两个纯虚函数Area和Perimeter,表明任何实现这个接口的类必须提供这两个函数的定义。这种减少了耦合性,提高了代码的可重用性。

2. 派生类的默认实现

在派生类中不一定要重新定义纯虚函数,如果派生类没有重新定义某个纯虚函数,那么就会继承基类中定义的该纯虚函数,可以实现一个或多个派生类的默认实现。例如:


class Shape

{

 public:

  virtual ~Shape() = default;

  virtual void Draw() const = 0;

  virtual void Save() const = 0;

};

class Circle : public Shape

{

 public:

  virtual void Draw() const override

  

    // 画圆

  

  // Save函数不需要在这个派生类中被重新定义,会继承基类的默认实现

};

可以看到,在Circle中我们只重新定义了Draw函数,Save函数则直接继承自基类Shape的默认实现。

3. 结构体实现多态

C++中的结构体也可以使用纯虚函数来实现多态。例如:


struct Drawable

{

 virtual ~Drawable() = default;

 virtual void Draw() const = 0;

};

struct Circle : Drawable

{

 virtual void Draw() const override

 

  // 画圆

 

};

struct Square : Drawable

{

 virtual void Draw() const override

 

  // 画正方形

 

};

void DrawAll(std::vector<Drawable*> const& drawables)

{

 for (auto&& drawable : drawables)

 {

  drawable->Draw();

 }

}

在这个例子中,我们使用了结构体Circle和Square继承自Drawable,分别实现了圆和正方形的画法。在DrawAll函数中,通过遍历一个存储指向Drawable指针的向量,我们可以使用每一个派生类的Draw函数来画不同的形状,这就是多态的表现。

在实际编程中,纯虚函数是非常常见的,可以极大地提高代码的可读性和可维护性。但是,在使用纯虚函数时,也要注意它的缺陷,比如它不能够自己被调用、不能被定义为静态成员函数等。总之,对于纯虚函数的合理使用,既能体现出C++语言的强大灵活性,也能为程序员提供编程便利和优雅代码。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复