C++虚函数表、多态

金歌  金牌会员 | 2022-6-24 13:31:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 650|帖子 650|积分 1950

概述

虚函数表是C++实现多态的一种方式。
问题:

  • 什么情况下C++会使用虚指针和虚函数表?
  • 如果子类不新增任何虚函数,也不重写父类的虚方法,会和父类共用一张虚函数表么?
  • 父类的构造函数为什么不能正确的调用虚函数?
C++虚函数表指针和虚函数表

创建一个Base类
  1. class Base
  2. {
  3. public:
  4.         int a;
  5.         int b;
  6. };
复制代码
查看Base内存布局

1>class Base        size(8):
1>        +---
1> 0        | a
1> 4        | b
1>        +---
为Base类添加一个虚函数
  1. class Base
  2. {
  3. public:
  4.         int a;
  5.         int b;
  6.         virtual void BaseFunc1()
  7.         {
  8.                 std::cout << "Call BaseFunc1 From Base" << std::endl;
  9.         };
  10. };
复制代码
查看Derive类的内存分布

1>class Derive        size(12):
1>        +---
1> 0        | +--- (base class Base)
1> 0        | | {vfptr}
1> 4        | | a
1> 8        | | b
1>        | +---
1>        +---
1>Derive::$vftable@:
1>        | &Derive_meta
1>        |  0
1> 0        | &Base::BaseFunc1
1> 1        | &Base::BaseFunc2
虚函数表的内容和父类Base一样
查看Base和Derive的虚函数表地址


Base和Derive并非公用一张虚函数表。
Derive重写父类Base的方法

[code]class Derive : public Base{public:        virtual void BaseFunc1() override        {                std::cout         +---
1> 0        | +--- (base class Base)
1> 0        | | {vfptr}
1> 4        | | a
1> 8        | | b
1>        | +---
1>        +---
1>Derive::$vftable@:
1>        | &Derive_meta
1>        |  0
1> 0        | &Derive::BaseFunc1
1> 1        | &Base::BaseFunc2
1>Derive::BaseFunc1 this adjustor: 0</p></blockquote>此时虚函数表的0元素被替换成了Derive::BaseFunc1的地址。
为Derive添加一个新的虚函数

[code]class Derive : public Base{public:        virtual void BaseFunc1() override        {                std::cout  0        | | {vfptr}
1> 4        | | a
1> 8        | | b
1>        | +---
1>        +---
1>Derive::$vftable@:
1>        | &Derive_meta
1>        |  0
1> 0        | &Derive::BaseFunc1
1> 1        | &Base::BaseFunc2
1> 2        | &Derive::DeriveFunc1
1>Derive::BaseFunc1 this adjustor: 0
1>Derive::DeriveFunc1 this adjustor: 0</p></blockquote>Derive的虚函数表添加了一个新的函数地址。
让父类Base在构造函数中调用虚函数BaseFunc1。

[code]class Base{public:        Base()        {                BaseFunc1();        }        int a;        int b;        virtual void BaseFunc1()        {                std::cout

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表