zoukankan      html  css  js  c++  java
  • 虚函数表

    原文地址:https://www.cnblogs.com/hushpa/p/5707475.html

    1. 基础知识:
    (1) 32位os 指针长度为4字节, 64位os 指针长度为8字节, 下面的分析环境为64位 linux & g++ 4.8.4.
    (2) new一个对象时, 只为类中成员变量分配空间, 对象之间共享成员函数。

    2、代码

    #include <iostream>
    
    using namespace std;
    
    class Base {
    public:
        virtual void f() {cout<<"base::f"<<endl;}
        virtual void g() {cout<<"base::g"<<endl;}
        virtual void h() {cout<<"base::h"<<endl;}
    };
    
    class Derive : public Base{
    public:
        void g() {cout<<"derive::g"<<endl;}
    };
    
    //可以稍后再看
    int main () {
        cout<<"size of Base: "<<sizeof(Base)<<endl;
    
        typedef void(*Func)(void);
        Base b;
        Base *d = new Derive();
    
        long* pvptr = (long*)d;
        long* vptr = (long*)*pvptr;
        Func f = (Func)vptr[0];
        Func g = (Func)vptr[1];
        Func h = (Func)vptr[2];
    
        f();
        g();
        h();
    
        return 0;
    }

    C++中的多态是用虚函数实现的: 子类覆盖父类的虚函数, 然后声明一个指向子类对象的父类指针, 如Base *b = new Derive();
    当调用b->f()时, 调用的是子类的Derive::f()。

    3 、虚函数表
        包含虚函数的类才会有虚函数表, 同属于一个类的对象共享虚函数表, 但是有各自的_vptr.
        虚函数表实质是一个指针数组,里面存的是虚函数的函数指针。

    Base中虚函数表结构:

    Derive中虚函数表结构:

    4、多继承

  • 相关阅读:
    AC自动机讲解超详细
    区间树Splay——[NOI2005]维护数列
    区间树Splay——[NOI2005]维护数列
    Trie学习总结
    微信小程序刮刮乐
    微信小程序获得高度
    微信小程序多video播放暂停问题
    vue中的问题思考
    vue的开发技巧
    微信小程序消息推送,前端操作
  • 原文地址:https://www.cnblogs.com/qingpeng/p/13692286.html
Copyright © 2011-2022 走看看