zoukankan      html  css  js  c++  java
  • 虚表/虚指针

    虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?从more effecive c++其中一篇文章里面可以知道:是每个类用了一个虚表,每个类的对象用了一个虚指针。具体的用法如下:

    class A
    {
    public:
    virtual void f();
    virtual void g();
    private:
    int a
    };

    class B : public A
    {
    public:
    void g();
    private:
    int b;
    };

    //A,B的实现省略

      因为A有virtual void f(),和g(),所以编译器为A类准备了一个虚表vtableA,内容如下:

    A::f 的地址
     A::g 的地址

    B因为继承了A,所以编译器也为B准备了一个虚表vtableB,内容如下:

    A::f 的地址
    B::g 的地址

    注意:因为B::g是重写了的,所以B的虚表的g放的是B::g的入口地址,但是f是从上面的A继承下来的,所以f的地址是A::f的入口地址。

    然后某处有语句 B bB;的时候,编译器分配空间时,除了A的int a,B的成员int b;以外,还分配了一个虚指针vptr,指向B的虚表vtableB,bB的布局如下:

    vptr : 指向B的虚表vtableB

    int a: 继承A的成员

    int b: B成员


    当如下语句的时候:
    A *pa = &bB;

    pa的结构就是A的布局(就是说用pa只能访问的到
  • 相关阅读:
    在ConcurrentModificationException异常上的联想
    记录一下自己爬虎牙LOL主播的爬虫思路
    ajax解决跨域问题
    解决多线程下数据库操作问题
    浅谈时间复杂度
    想一下,最大公约数怎么求
    IO流与IO缓冲
    循环移位
    3Sum探讨(Java)
    Two Sum(两个数的相加)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318548.html
Copyright © 2011-2022 走看看