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

har*_*ris 3 c++ inheritance runtime compile-time

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

例子?

sbi*_*sbi 6

在C++中,继承本身(没有多态)是一个编译时功能.在编译的代码中,两者之间几乎没有差别

struct foo : bar {};
Run Code Online (Sandbox Code Playgroud)

struct foo { bar b; };
Run Code Online (Sandbox Code Playgroud)

除了访问其成员的偏移量之外,在编译的二进制文件中没有任何关于如何bar关联的"知识" foo.


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

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


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