欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

理解C++虚函数

程序员文章站 2024-03-21 11:48:04
...

1、 简单介绍

C++虚函数是定义在基类中的函数,子类必须对其进行覆盖。在类中声明(无函数体的形式叫做声明)虚函数的格式如下:

virtual void display();

2、虚函数的作用

虚函数有两大作用:

(1)定义子类对象,并调用对象中未被子类覆盖的基类函数A。同时在该函数A中,又调用了已被子类覆盖的基类函数B。那此时将会调用基类中的函数B,可我们本应该调用的是子类中的覆盖函数B。虚函数即能解决这个问题。

  • 以下是没有使用虚函数的例子:
#include<iostream>
using namespace std;
class Father                    //基类 Father
{
public:
    void display() {cout<<"Father::display()\n";}
    //在函数中调用了,子类覆盖基类的函数display() 
    void fatherShowDisplay() {display();} 
};

class Son:public Father                 //子类Son 
{
public:
    //重写基类中的display()函数
    void display() {cout<<"Son::display()\n";}
};

int main()
{
    Son son;        //子类对象 
    son.fatherShowDisplay();    //通过基类中未被覆盖的函数,想调用子类中覆盖的display函数 
}

该例子的运行结果是:

 Father::display() 
  • 以下是使用虚函数的例子:
#include<iostream>
using namespace std;
class Father                    //基类 Father
{
public:
    virtual void display() {cout<<"Father::display()\n";}
    //在函数中调用了,子类覆盖基类的函数display() 
    void fatherShowDisplay() {display();} 
};

class Son:public Father                 //子类Son 
{
public:
    //重写基类中的display()函数
    void display() {cout<<"Son::display()\n";}
};

int main()
{
    Son son;        //子类对象 
    son.fatherShowDisplay();    //通过基类中未被覆盖的函数,想调用子类中覆盖的display函数 
}

该例子的运行结果是:

Son::display()

(2)在使用指向子类对象的基类指针,并调用子类中的覆盖函数时,如果该函数不是虚函数,那么将调用基类中的该函数;如果该函数是虚函数,则会调用子类中的该函数。

  • 以下是没有使用虚函数的例子:
#include<iostream>
using namespace std;
class Father                    //基类 Father
{
public:
    void display()
    {cout<<"Father::display()\n";}
};

class Son:public Father                 //子类Son 
{
public:
    void display()          //覆盖基类中的display函数 
    {cout<<"Son::display()\n";}
};

int main()
{
    Father *fp;     //定义基类指针 
    Son son;        //子类对象 
    fp=&son;        //使基类指针指向子类对象 
    fp->display();  //通过基类指针想调用子类中覆盖的display函数 
}

该例子的运行结果是:

Father::display()

结果说明,通过指向子类对象的基类指针调用子类中的覆盖函数是不能实现的,因此虚函数应运而生。

  • 以下是使用虚函数的例子:
#include<iostream>
using namespace std;
class Father                    //基类 Father
{
public:
    void virtual display()  //定义了虚函数
    {cout<<"Father::display()\n";}
};

class Son:public Father //子类Son 
{
public:
    void display()          //覆盖基类中的display函数 
    {cout<<"Son::display()\n";}
};

int main()
{
    Father *fp;     //定义基类指针 
    Son son;        //子类对象 
    fp=&son;        //使基类指针指向子类对象 
    fp->display();  //通过基类指针想调用子类中覆盖的display函数 
}

该例子的运行结果是:

Son::display()

 

相关标签: 虚函数