虚函数表

代码

先不说废话啦,上代码:

#include<iostream>
#include <stdio.h>
using namespace std;

class B0 {
public:
    virtual void vir1() {cout << "B0::vir1" << endl;}
    virtual void vir2() {cout << "B0::vir2" << endl;}
};

class B1: public B0 {
public:
    virtual void vir1() {cout << "B1::vir1" << endl;}
    virtual void barB1() {cout << "B1::bar" << endl;}
    virtual void fooB1() {cout << "B1::foo" << endl;}
};

class B2: public B0 {
public:
    virtual void vir2() {cout << "B2::vir2" << endl;}
    virtual void barB2() {cout << "B2::bar" << endl;}
    virtual void fooB2() {cout << "B2::foo" << endl;}
};

class D : public B1, B2 {
public:
    void fooB1() {cout << "D::foo" << endl;}
    void barB2() {cout << "D::bar" << endl;}
};

typedef void (*Func)();
int test1() {
    D tt;
    Func* vptr1 = *(Func**)&tt;
    Func* vptr2 = *((Func**)&tt + 1);

    cout<<"============"<<endl;
    vptr1[0]();
    vptr1[1]();
    vptr1[2]();
    vptr1[3]();
    vptr1[4]();
    cout<<"============"<<endl;
    vptr2[0]();
    vptr2[1]();
    vptr2[2]();
    vptr2[3]();
    cout<<"============"<<endl;

    return 0;
}

输出:

============
B1::vir1
B0::vir2
B1::bar
D::foo
D::bar
============
B0::vir1
B2::vir2
D::bar
B2::foo
============

结论:

多重继承会有多个虚函数表,几重继承,就会有几个虚函数表。这些表按照派生的顺序依次排列,如果子类改写了父类的虚函数,那么就会用子类自己的虚函数覆盖虚函数表的相应的位置,如果子类有新的虚函数,那么就添加到第一个虚函数表的末尾。

用图表示

画了一下图,大概是这样:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 多态性:一个接口,多种方法.程序在运行时才确定调用的函数,是 oop 的核心概念. 多态性通过虚函数来实现,子类可...
    曹小恒阅读 2,206评论 2 4
  • 什么叫多态性? A:同样的消息被不同类型的对象接收时,对象会采用完全不同的行为处理消息。 多态性有几种? A:静态...
    凉拌姨妈好吃阅读 658评论 0 0
  • 大家都知道C++动态绑定的实现是通过虚函数体现的,再深入研究一下,程序是如何知道该调用哪个函数呢?这就涉及到了虚函...
    wenmingxing阅读 2,266评论 2 3
  • 虚函数 参考文章: C++ 虚函数表解析 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父...
    biuTcode阅读 466评论 0 1
  • 转载 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,...
    扎Zn了老Fe阅读 446评论 1 5