class base {
public:
virtual void fn(){}
};
class der: public base {
public:
void fn(){}
};
der d;
base *b = &d;
b->fn();
当编译器遇到语句b->fn(
)时,编译器可以获得以下信息:
- b 是指向类基的指针,
- 基类有一个虚函数和一个 vptr。
我的问题是:类 der 的 vptr 如何在运行时出现?
最佳答案
神圣标准不需要 vptr 或 vptr 表。然而在实践中,这是唯一的实现方式。
所以这是发生了什么的伪代码:
a_base_compatible_vtable_ptr = b->__vtable_ptr__
a_func_ptr = a_base_compatible_vtable_ptr[INDEX_FOR_fn]
a_func_ptr( b )
一个主要的见解是,对于 der
类的对象,对象中的 vtable 指针将指向 der
类的 vtable,这是 兼容的 与 base
类的 vtable,但包含指向 der
类的函数实现的指针。
因此,函数的der
实现被调用。
在实践中,在第 (3) 点中传递的 this
指针参数通常是优化的,特殊的,通过在专用处理器寄存器中而不是在机器上传递 this
指针堆栈。
有关更深入的讨论,请参阅有关 C++ 内存模型的文献,例如Stanly Lippman’s book Inside the C++ Object Model .
干杯,
关于c++ - 虚函数调用机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7565083/