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