c++ - 如何确定编译器是对虚函数使用早期绑定(bind)还是后期绑定(bind)?

标签 c++ compiler-construction late-binding early-binding

我有以下代码:

class Pet {
public:
  virtual string speak() const { return ""; }
};

class Dog : public Pet {
public:
  string speak() const { return "Bark!"; }
};

int main() {
  Dog ralph;
  Pet* p1 = &ralph;
  Pet& p2 = ralph;
  Pet p3;

  // Late binding for both:
  cout << "p1->speak() = " << p1->speak() <<endl;
  cout << "p2.speak() = " << p2.speak() << endl;

  // Early binding (probably):
  cout << "p3.speak() = " << p3.speak() << endl;
}

有人要求我确定编译器是对最终函数调用使用早期绑定(bind)还是后期绑定(bind)。我在网上搜索过,但没有找到任何可以帮助我的东西。谁能告诉我如何执行此任务?

最佳答案

您可以查看反汇编,看它是否似乎是通过 vtable 重定向。

线索是它是直接调用函数地址(早期绑定(bind))还是调用计算地址(后期绑定(bind))。另一种可能性是该函数是内联的,您可以将其视为早期绑定(bind)。

当然,该标准并未规定实现细节,可能还有其他可能性,但这涵盖了“正常”实现。

关于c++ - 如何确定编译器是对虚函数使用早期绑定(bind)还是后期绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7611168/

相关文章:

C++:本地时间提升一小时

c - C/C++ 解析器如何工作?

asp.net - 此 ASP.NET 功能的文档在哪里? <%= 字符串格式,params object[] args %>

c# - 在 C# 中使用后期绑定(bind)获取特定的 Excel 实例

vb6 - 如何传递后期绑定(bind)参数

c++ - 使用模板模板参数合并可变参数模板中的类型

android - C++ 生成器 : Get the model of an Android Device

c - 我想在 C 中为二维数组创建一个通用选择器

c++ - 二叉搜索树段错误

c++ - C++ 编译中有哪些不同的标记类型?