美文网首页
5 - 虚函数指针存放在内存中什么位置

5 - 虚函数指针存放在内存中什么位置

作者: 李伟13 | 来源:发表于2020-05-05 16:44 被阅读0次

虚函数

使用基类的引用或指针调用一个虚成员函数时会执行动态绑定
基类

class Quote {
public:
  std::string isbn() const ;
  virtual double net_price (std: :size_ t n) const;
};

派生类

class Bulk_Quote : public Quote{
public:
  double net_price (std: :size_ t n) const override;
};
double print_total(ostream &os, const Quote &item, size_t n){
  double ret = item.net_price();
  os << "ISBN: " << item.isbn() 
    << " # sold: " <<  n << "total due: " << ret << endl;
  return ret;
}

即便形参是基类类型,因为item是引用而net_price是虚函数,所以调用net_price的哪个版本完全依赖于运行时绑定到item实参的实际(动态)类型
动态绑定只有当我们通过指针或引用调用虚函数时才会发生.

一个类(有虚函数)有一张虚表,虚表一般在代码段中
类实例中存放指向虚函数表的指针。
基类和派生类共用一张虚函数表

虚函数表是编译器在编译时期创建的, 只存在一份
定义类对象时, 编译器自动将类对象的__vfptr指向这个虚函数表

虚函数指针存放在什么位置应该看该对象如何被定义

假设我们有基类class A,继承了A的派生类class B,基类中有虚函数,派生类实现了基类的虚函数

A *a = new B();
a在栈区,*a在堆区,即对象实例在堆区

B b;
A *a = &b;
a在栈区,b也在栈区,对象实例是b,在栈区

虚函数指针跟随对象实例被创建,分别在堆区和栈区.{虚函数指针/其他成员变量}

参考资料

https://blog.twofei.com/496/
https://blog.csdn.net/qq_36359022/article/details/81870219

相关文章

  • 5 - 虚函数指针存放在内存中什么位置

    虚函数 使用基类的引用或指针调用一个虚成员函数时会执行动态绑定基类 派生类 即便形参是基类类型,因为item是引用...

  • 智能指针

    智能指针可以不手动释放内存? 虚函数中虚构函数定义为虚函数的话,自动调用子类父类的虚函数释放内存。

  • 【前端学习笔记】JS引用类型——引用栈中的一地址

    引用类型是存放在堆内存中的对象。 引用类型是存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置...

  • Boolan----C++对象模型(Object Model)

    * 虚指针(vptr):用于指向类中的虚函数所在的虚函数列表(vtbl),不管一共有几个虚函数,其在内存中所占的内...

  • 函数指针-函数指针-案例-动态分配内存-重新分配内存-内存泄漏

    1、函数指针2、函数指针-案例3、动态分配内存4、重新分配内存5、内存泄漏 1、函数指针 2、函数指针-案例 3、...

  • GEEKBAND面向C++下第二周

    虚指针和虚表 vptr vtbl vptr:虚指针,内存占用4字节,只要类里面有虚函数,就会产生指针,如左图,一万...

  • 第九章函数的再探

    9.1 函数指针 函数的内存地址存储了函数的开始执行的位置,存储在函数指针中的内容就是这个地址。 9.1.1 声...

  • C++ 重/难点

    1. 虚函数机制 之 5大问题 (1) 虚成员函数指针 vs. 虚成员函数地址 vtbl 中 的 偏移/数组索引 ...

  • Part2_Week2(boolan)

    vptr和vtbl:如果类中包含虚函数,则其对象中包含一个虚指针,虚指针指向一个虚表,虚表指向虚函数的定义。虚函数...

  • C++ 对象内存布局

    虚函数, 虚基类 同时存在的时候, 对象内存布局的影响。 转自对象内存布局 (16) - CSDN博客 虚基类指针...

网友评论

      本文标题:5 - 虚函数指针存放在内存中什么位置

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