美文网首页
C++对象模型——单继承结构中虚指针的初始化

C++对象模型——单继承结构中虚指针的初始化

作者: loki528 | 来源:发表于2019-11-18 21:08 被阅读0次

分析一个在基类的构造函数中调用虚函数的问题。

#include <iostream>
using namespace std;

class A {
public:
  virtual void init() {
    cout<<"A"<<endl;
  }
  A() {
  test();
  }
};
class B: public A {
public:
  virtual void init() {
    cout<<"B"<<endl;
  }
};
int main() {
  B* b = new B();
  b->init();
  return 0;
}

结果会输出

AB

分析背后的原因。
A有一个虚函数,所以会增加一个__vfptr的成员,虚指针。该成员在A的构造函数中初始化,伪代码为

A::A() {
  this->__vfptr = A::vfptr;
  this->__vfptr[0]();          // this->init(); 调用第一个虚函数
}

B的构造函数伪代码如下:

B::B() {
  this->A::A();
  this->__vfptr = B::vfptr;
}

所以在调用B的构造函数的时候,会调用A的构造函数, A的构造函数会调用类的第一个虚函数init。
虚函数是通过虚指针加函数下标调用的,调用init即为调用__vfptr[0]()。
因为在A的构造函数中,__vfptr会先初始化为A::vfptr, 所以会先调用A::init。
所以先输出A。

第二次b->init()。转化一下,同样是

b->__vfptr[0]();  //b->init();

因为调用完B的构造函数后,__vfptr被B::vfptr初始化,所以后面调用init,是B::init。
所以输出B。

意识到__vfptr的存在和初始化,可以了解虚函数调用的本质,看透背后的原理。

相关文章

网友评论

      本文标题:C++对象模型——单继承结构中虚指针的初始化

      本文链接:https://www.haomeiwen.com/subject/babbictx.html