继承编译时间还是运行时间?

时间:2012-01-11 18:36:08

标签: c++ inheritance runtime compile-time

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

实施例

4 个答案:

答案 0 :(得分:6)

在C ++中, 继承本身 without polymorphism 是编译时功能 即可。在编译的代码中,

之间几乎没有区别
struct foo : bar {};

struct foo { bar b; };

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


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

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


如果您对某些C ++功能的运行时成本感兴趣,可能需要尝试获取Stanley Lippman的 Inside the C++ Object Model 的副本。这是一本旧书,但是如果你想知道虚拟成员函数是如何被普遍实现的,以及基本对象在多继承场景中如何通常在内存中布局,以及所有这些如何影响性能,那么你可以在这里找到彻底的讨论这些话题。

答案 1 :(得分:3)

简单来说,

关键字virtual指定编译器或运行时是否应该解除。

答案 2 :(得分:0)

这取决于“发生”的含义...它在编译时定义,但在运行时执行(vtable等)。

答案 3 :(得分:-1)

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