• 虚函数总结篇


    关于虚函数

    核心:虚函数是实现多态机制的核心——通过基类访问派生类,访问过程在程序运行时动态确定。

    虚函数

    使用基类指针或者引用访问派生类;使用类指针调用成员函数时,普通函数由指针类型确定,而虚函数由指针指向的实际类型决定。

    虚函数调用详细过程:

    上述说到:虚函数的访问过程在程序执行过程中动态确定,这一过程究竟是怎么执行的?

    实际上,当一个类中定义了一个虚函数的时候,这个类的成员变量就会隐式的多一个变量:虚函数表指针(vptr),这个指针指向“虚函数”表,表中的数据为函数指针(指向函数的指针,即存储 函数地址 的变量),(题外话:普通成员函数,虚函数,虚函数表都是一个类的所有对象公有的,成员变量和虚函数表指针(可看作隐式成员变量)是每个对象私有的),因此实际上,虚函数的实现是程序在运行时候,通过对象内存中的vptr找到虚函数表中的相应的函数指针(也就是函数入口地址),然后通过这个表中的函数指针去找到对应的虚函数的实现区域。当类有多个虚函数的时候,仍然只有一个虚函数表指针vptr,但此时虚函数表中有多个函数指针。

    纯虚函数

    纯虚函数的理念来源于:有时候我们定义一个基类,但是我们并不想,或者并不能够赋予其意义(比如定义动物类,生成一个动物就显得没有意义),这个时候,这个基类叫做抽象类,抽象类只表征某种意义,但不做实现,因此抽象类不能生成对象(创建实例)

    因而纯虚函数是定义在抽象类中的虚函数(当然了,并不是说有类分为抽象类和非抽象类,只是说明,因为一个基类中存在了纯虚函数,因此该类是抽象类)。

    相当于本质上:定义纯虚函数是为了在基类中实现一个接口,用来规范子类的行为,也即表明了继承该基类的子类必须实现该虚函数。这就是说明了:基类中定义的纯虚函数,在子类中必须实现(否则如果字类也不实现,那么子类依然是抽象类,依然无法实例化)。

    关于类与内存

    对于一个类 class A,当我们sizeof类A的一个对象,得到的大小是所有成员变量的总的字节数(如果有虚函数,则要加上隐式成员变量vptr的大小(4字节或者8字节)。

    类对象中的成员变量存放的位置取决于对象本身的位置,如果对象处于函数内部,那么这些成员变量也在栈空间,如果类对象是new出来的,则就在堆区域。等等......

  • 相关阅读:
    JavaEE中Filter实现用户登录拦截
    【Tomcat】如何注册Tomcat到Window Service服务
    案例分析:项目组内踢皮球事件
    最大子序列求和问题
    《游戏脚本的设计与开发》-第一部分总结 文字脚本的功能扩展和一个游戏测试
    ajax异步请求实例
    创建用于编译和运行Java程序的批处理文件
    Codeforces Round #189 (Div. 2)
    新的研究方向
    怎样在android实现uc和墨迹天气那样的左右拖动效果
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/13180675.html
Copyright © 2020-2023  润新知