理解C++虚函数

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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值