继承编译时或运行时

inheritance compile time or run time?

本文关键字:运行时 编译 继承      更新时间:2023-10-16

在c++中,继承发生在运行时还是编译时?

示例?

在C++中,继承本身不带多态性是一个编译时特性。在编译的代码中,之间几乎没有差异

struct foo : bar {};

struct foo { bar b; };

除了访问其成员的偏移量外,在编译的二进制文件中不会有任何关于barfoo如何相关的"知识"。


然而,当您将多态性(即virtual函数,允许dynamic_cast<>())添加到图片中时,这与不同。它允许后期绑定:将在运行时决定调用哪个函数。当然,这需要数据结构来执行这一操作(通常使用所谓的虚拟表),并且这些数据结构在运行时被访问,以便确定要调用哪个函数。

此外,virtual基类需要运行时支持才能在派生对象中访问它们。


如果您对某些C++功能的运行时成本感兴趣,您可能想尝试获得Stanley Lippman的《C++对象模型内部》的副本。这是一本旧书,但如果你想知道在多继承场景中,虚拟成员函数通常是如何实现的,基本对象通常是如何在内存中布局的,以及所有这些如何影响性能,你会在这里找到对这些主题的深入讨论。

最简单地说,

关键字virtual指定编译器还是运行库应该执行提升。

这取决于你所说的"发生"是什么意思。。。它在编译时定义,但在运行时执行(vtables等)。

有一些技术可以在编译和运行时实现继承。