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

    虚函数表

    class Base {

    public:

        virtual voif f() {

            cout << "Base::f" << endl;

        }    

        virtual void g() {

        }    

        

        virtual void h() {

        }    

    };

    在上面这个类中, 虚函数表是这样设置的

    一般继承(无虚函数覆盖)

     

    对于这样的继承关系, 虚函数表的结构是

     

    从上面两张图我们可以看到两点

    1. 虚函数按照其声明顺序放在虚函数表中

    2. 父亲的虚函数放在孩子的虚函数之前

    一般继承(有虚函数覆盖)

     

     

     从上面两张图中, 我们可以看到两点

    1. 覆盖的 f() 函数被放到虚函数原来父函数的位置

    2. 其他函数的相对位置不变

    多重继承(无虚函数覆盖)

     

    可以看出

    1. 每个父类都有自己的虚函数表

    2. 子类的成员函数被放到第一个虚函数表

    多重继承(有虚函数覆盖)

     

     

    有了这种表, 我们便可以实现

    Derive d;

    Base1 *b1 = &d;

    Base2 *b2 = &d;

    Base3 *b3 = &d;

    b1->f(); //Derive::f()

    b2->f(); //Derive::f()

    b3->f(); //Derive::f()

    b1->g(); //Base1::g()

    b2->g(); //Base2::g()

    b3->g(); //Base3::g()

    转自: http://blog.csdn.net/haoel/article/details/1948051

  • 相关阅读:
    poj1830 开关问题
    poj1681 Painter's Problem
    poj1222 EXTENDED LIGHTS OUT
    bzoj1923 [Sdoi2010]外星千足虫
    bzoj1013 [JSOI2008]球形空间产生器sphere
    poj2888 Magic Bracelet
    poj2409 Let it Bead
    poj1286 Necklace of Beads
    bzoj1004 HNOI2008 Cards
    bzoj2040 [2009国家集训队]拯救Protoss的故乡
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3640693.html
Copyright © 2011-2022 走看看