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

原文地址:https://www.cnblogs.com/zhouzhuo/p/3640693.html