虚函数(虚函数表)-虚析构函数-纯虚数-纯析构函数

发布于:2023-01-19 ⋅ 阅读:(275) ⋅ 点赞:(0)

 

 用基类指针指向派生类  调用的还是基类函数,

为什么?

 如果想去用父类指针,引用访问子类对象中的成员函数  需要用到虚函数

(基类定义为虚函数   子类不管加不加virtual  相同函数都是虚函数)

 

 虚函数原理?

调试运行会产生一个虚函数指针(vfptr)---涉及到继承 指针指向虚函数表 表中是子类成员方法

 

虚函数本质是函数指针变量  vfptr虚函数指针 指向虚函数表(vftable):虚函数表存放函数入口地址

但不涉及到继承 vfptr指向自己

 

 虚函数应用实例

 

 c++动态绑定机制?

当编译器发现类中有虚函数时,编译器会自动创建一个虚函数表,把虚函数入口地址放入虚函数表中,

并且在类中秘密增加一个指针,这个指针就是vpointer(缩写vptr),这个指针是指向对象的虚函数表。在多态调用的时候,根据vptr指针,找到虚函数表来实现动态绑定。当对虚函数重写时,虚函数表中的地址也会随之更新, 保证动态绑定是根据实际类型调用正确函数

虚析构

和虚函数同理

 

 只会析构Base    因为Base指针只能调用子类的基类部分   不能调用到子类析构

纯虚函数

格式:

 如果一个类拥有纯虚函数那么这个类就是抽象类(不能实例化对象,因为纯虚函数没有具体实现,) 如果继承子类也没有实现那么这个类也是抽象类

 案例:饮水制作


#include<iostream>
using namespace std;
class Drinking{
    public:
        //烧水
        virtual void boil()=0;
        //冲泡
        virtual void brew()=0;
        //倒入杯中
        virtual void cup()=0;
        //加入辅料
        virtual void put()=0;
        void makedrink()
        {
            boil();
            brew();
            cup();
            put();
        }
};
class coffe:public Drinking{
    public:
       void boil()
       {
           cout<<"加入农夫山泉"<<endl;
                                                                                    
        }
       void brew()
       {
           cout<<"冲咖啡"<<endl;
       }
       void cup()
       {
           cout<<"就咖啡倒入杯中"<<endl;
       }
       void put()
       {
           cout<<"加入牛奶"<<endl;
       }
};
class bbbb:public Drinking{
    void boil()
    {
        cout<<"1"<<endl;
    }
    void brew()
    {
        cout<<"2"<<endl;
    }
    void cup()
    {
        cout<<"3"<<endl;
    }
    void put()
    {
        cout<<"4"<<endl;
    }
};
int main()
{
    Drinking*p=new coffe;
    p->makedrink();
    Drinking*b=new bbbb;
    b->makedrink();
    return 0;
}

 纯析构函数(必须实现函数体--类外)

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到