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

2020-05-05  本文已影响0人  李伟13

虚函数

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

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

上一篇 下一篇

猜你喜欢

热点阅读