c++ - 虚函数调用机制

标签 c++ inheritance

class base {
public:
  virtual void fn(){}
};


class der: public base {
public:
  void fn(){}
};

der d;

base *b = &d;
b->fn();

当编译器遇到语句b->fn()时,编译器可以获得以下信息:

  1. b 是指向类基的指针,
  2. 基类有一个虚函数和一个 vptr。

我的问题是:类 der 的 vptr 如何在运行时出现?

最佳答案

神圣标准不需要 vptr 或 vptr 表。然而在实践中,这是唯一的实现方式。

所以这是发生了什么的伪代码:

  1. a_base_compatible_vtable_ptr = b->__vtable_ptr__
  2. a_func_ptr = a_base_compatible_vtable_ptr[INDEX_FOR_fn]
  3. 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/

相关文章:

c++ - 为什么这段代码打印 0

c++ - 如果有专门的函数和模板函数,为什么没有必要专门针对 `std::nullptr_t`

c++ - Objective-C 到 C++ 字符串转换导致内存泄漏

C++ 命名数组

c++ - 多态还是继承?

C++ 相关的继承层次

oop - 避免抽象类和继承

c# - 如何在派生类时更改常量或静态变量的值?

c++ - 从shared_ptr <T>派生

c++ - 使用指向方法的指针的 MSVC 编译器 fatal error C1001