ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++虚函数表、多态 [打印本页]

作者: 金歌    时间: 2022-6-24 13:31
标题: 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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4