c++ - 编译器如何实现C++继承?

标签 c++ class inheritance compiler-construction implementation

C++ 支持继承。

但是它在编译器中是如何实现的呢?

编译器是否将所有实现从父级复制并粘贴到子级?

最佳答案

非常简单,如果我们谈论这样的事情:

class A 
{
    public:
       int func1() { do something; }
       int func2() { do something; }
 };

class B : public A
{
    public:
       int func2() { do somethign else; }
};

B b;

b.func1();

然后编译器内部发生的事情将是这样的(记住,这是非常简化的,我确信真正的编译器代码会复杂得多):

 ... fname = "func1" from the source code ... 
 ... object = "b"; 
function fn;
while (!(fn = find_func(object, fname)))  
   object = parent_object(object);
if (fn)
  produce_call(fn); 
else
  print_error_not_found(fname);

如果我们谈论的是虚函数,那么编译器将生成一个表,其中保存各个虚函数的地址,并且该表是为每个类生成的,基于类似的“查找存在于其中的函数”的原理这个类或其父类之一)。

[在上面,我忽略了一个类可以有多个“父”类的事实 - 它不会改变事物的工作方式,只是代码必须维护一个“更多”的列表或数组同级别类(class)"]

关于c++ - 编译器如何实现C++继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617139/

相关文章:

c++ - 将表单 CString 转换为 const char*

c++ - 存在新串行端口时发出信号

c++ - 获取可执行文件路径

c++ - 自定义 vector 类型

javascript - 如何调用backbone中父模型的默认方法

javascript - 为什么 JavaScript 使用原型(prototype)继承来实现?

c++ - 小字符串优化(SSO)和移动语义

c++ - C++ 类之间的变量超出范围

php - 为 foreach() 提供的参数无效;数组设置不正确

Swift 3 从扩展访问结构中的私有(private)属性