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只能访问的到
  • 相关阅读:
    重写Override和重加载Overload
    Java 继承
    poj 3263 Tallest Cow
    矩阵求和
    全排列
    最大乘积
    三角形面积
    Sum
    搭积木
    调手表
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318548.html
Copyright © 2011-2022 走看看