C++中virtual 虚函数的作用介绍

本文深入解析虚函数的概念,探讨其在基类与子类间的函数覆盖和调用机制。通过实例演示,展示如何利用虚函数实现多态性,解决基类指针调用子类覆盖函数的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,介绍

虚函数是定义在基类中的函数,子类必须对其进覆盖。在类中声明虚函数的格式: virtual void display(); 

 

2,作用

  (1)定义子类对象,并调用对象中未被子类覆盖的基类函数A。同时在该函数A中,又调用了子类覆盖的基类函数B。此刻将会调用基类中的函数B, 而我们原本是想调用是子类中的覆盖函数B。 而使用虚函数就可以解决这个问题。 

举个例: 

#include<iostream>

using namespace std;
class Father{
    void display() {cout<<"Father.dispaly() \n";} 

    void fatherShowDisplay(){display();
}

class Son:public father{
    public:
        void display(){cout<<"Son.dispaly() \n";}
}


int main(){
    Son son;
    son.fatherShowDisplay();
}

通过基类中未被覆盖的函数,来调用子类中被覆盖的display函数。

输出的结果是 Father.display() 。

修改方法: 将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{
   public:
   void display(){cout<<"father.display()";}
};

class Son::Father{
    public:
    void display(){cout<<"son.display";}
};

main(){
Father *p ; 
Son son;

p = &son;

p->display();
}

定义一个基类指针, 让它指向子类覆盖的函数,如果该函数没有使用virtual,输出的结果就是 father.dispaly

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值