首先引出,我们的新知识点——虚函数(virtual function)。


这是一种什么函数呢?简单来讲,就是一个函数前面用virtual声明的函数,一般形式如下:

virtual 函数返回值 函数名(形参)
{
    函数体
}


那它有什么用呢?虚函数的出现,允许函数在调用时与函数体的联系在运行的时候才建立,即所谓的动态联编。那么在虚函数的派生类的运行时候,就可以在运行的时候根据动态联编实现都是执行一个方法,却出现不同结果的效果,就是所谓的多态。这样解决上一节的问题就有了办法。


接下来,我们只需要把基类中的area方法声明为虚函数,那么主函数中无论Point类型的指针还是引用就都可以大胆调用,无用关心类型问题了。因为他们会依据实际指向的对象类型来决定调用谁的方法,来实现动态联编。


代码如下:

/**************************************
//Des:C++教程demo
//Author:Huang
//Copyright:www.dotcpp.com
//Date:2017/12/20
**************************************/
#include <iostream>
using namespace std;
#define PI 3.1415926
 
class Point
{
private:
    int x,y;
 
public:
    Point(int x=0,int y=0)
    {
        this->x = x;
        this->y = y;
    }
    virtual double area()
    {
        return 0.0;
    }
};
class Circle:public Point
{
private:
    int r;
public:
    Circle(int x,int y,int R):Point(x,y)
    {
        r = R;
    }
    double area()
    {
        return PI*r*r;
    }
};
 
int main()
{
 
    Point A(10,10);
    cout<<A.area()<<endl;
    Circle B(10,10,20);
    cout<<B.area()<<endl;
    Point *p;
    p = &B;
    cout<<p->area()<<endl;
    Point &pp=B;
    cout<<pp.area()<<endl;
    return 0;
 
}


修改后编译运行如下:

C++虚函数


大家请自行上机实验,体会虚函数及多态的作用。


需要注意的是:

1. 虚函数不能是静态成员函数,或友元函数,因为它们不属于某个对象。

2. 内联函数不能在运行中动态确定其位置,即使虚函数在类的内部定义,编译时,仍将看作非内联。

3. 构造函数不能是虚函数,析构函数可以是虚函数,而且通常声明为虚函数。


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)