继承编译时或运行时
inheritance compile time or run time?
在c++中,继承发生在运行时还是编译时?
示例?
在C++中,继承本身(不带多态性)是一个编译时特性。在编译的代码中,之间几乎没有差异
struct foo : bar {};
和
struct foo { bar b; };
除了访问其成员的偏移量外,在编译的二进制文件中不会有任何关于bar
与foo
如何相关的"知识"。
然而,当您将多态性(即virtual
函数,允许dynamic_cast<>()
)添加到图片中时,这与不同。它允许后期绑定:将在运行时决定调用哪个函数。当然,这需要数据结构来执行这一操作(通常使用所谓的虚拟表),并且这些数据结构在运行时被访问,以便确定要调用哪个函数。
此外,virtual
基类需要运行时支持才能在派生对象中访问它们。
如果您对某些C++功能的运行时成本感兴趣,您可能想尝试获得Stanley Lippman的《C++对象模型内部》的副本。这是一本旧书,但如果你想知道在多继承场景中,虚拟成员函数通常是如何实现的,基本对象通常是如何在内存中布局的,以及所有这些如何影响性能,你会在这里找到对这些主题的深入讨论。
最简单地说,
关键字virtual
指定编译器还是运行库应该执行提升。
这取决于你所说的"发生"是什么意思。。。它在编译时定义,但在运行时执行(vtables等)。
有一些技术可以在编译和运行时实现继承。
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在运行时解析函数,而不是在编译C++解析函数
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 在编译时为运行时设置环境变量
- 运行时检查失败 #0 用于运行时重新编译
- std::tuple 可以根据其值在编译时/运行时排序吗?
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 在编译时而不是运行时创建一个由两个字节组成的值
- scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定.如何使其可变?
- 如何在运行时编译 c++ 代码(如 Python 中的 eval)
- C 构造函数运行时/编译时间
- 有没有办法在运行时编译C++代码
- visual在源代码中是否有预定义的#define或其他方式来了解它是为C++/CX Windows运行时编译的
- 关于运行时/编译时和堆/堆栈的说明
- 如何在运行时编译C++程序并将其链接到DLL中
- 将编译器添加到程序中进行运行时编译的好方法是什么?
- 我们可以使用“LoadLibrary”让我们的应用程序用Visual Studio 2010和静态运行时编译吗?
- 运行时/编译时初始化char***
- 在混合运行时/编译时条件下调度标记