专业编程基础技术教程

网站首页 > 基础教程 正文

c++虚函数&纯虚函数 c 纯虚函数

ccvgpt 2024-11-12 09:53:22 基础教程 2 ℃

纯虚函数的声明

在C++中纯虚函数(pure virtual function), 它的申明格式如下:

class CShape{
public:
  virtual void Show() =0;
};

注意=0,即在普通的虚函数后面加上" =0"这样就声明了一个纯虚函数。

c++虚函数&纯虚函数 c 纯虚函数

什么情况下使用纯虚函数?

  1. 当想在基类中抽象出一个方法,且该基类只能被继承,而不能被实例化;
  2. 这个方法必须在派生类(derived class)中被实现;

如果满足以上两点,可以考虑将该方法申明为纯虚函数。

举例:

我们先定义一个形状的类(Shape),但凡是形状我们都要求其能显示自己。

class Shape
{
    virtual void Show() {};
};

但没有Shape这种形状,因此我们不想让Shape这个类被实例化,我们首先想到的是将Show函数的定义(实现)部分删除如下:

class Shape
{
    virtual void Show();
};

当我们使用下面的语句实例化一个Shape时:

Shape s; //不能这样,但是代码是可以通过编译,只是link时失败。

怎么样避免一个Shape被实例化,且在编译时就被发现?

答案是:使用纯虚函数。

我们再次修改Shape类如下:

class Shape {
public:
	virtual void Show() =0;
};

Shape s; //这时在编译时就会报错

再来看下被继承的情况,我们需要一个Circle的类,它继承自Shape,他必须实现基类(Shape)中的Show()方法。但时常我们可能在一个派生类中忘记了实现Show(),为了避免这种情况,纯虚函数发挥作用了。

class Circle:public CShape {
public:
	Circle() {
    printf("Circle ctor is invoked/n");
  };
  
 	void Msg() {
  	printf("Circle.Msg() is invoked/n");
 	};
};

Circle p2d; //如果派生类(Circle)没有实现Show(),则编译不通过。

纯虚函数的作用

总结一下,纯虚函数的作用有两点:

  1. 提早防止父类被实例化;
  2. 提早避免派生类忘记实现父类方法。

最近发表
标签列表