首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器如何实现C++继承?

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

Stack Overflow用户
提问于 2013-07-12 22:21:26
回答 2查看 1.8K关注 0票数 0

C++支持继承。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-12 22:38:11

非常简单,如果我们讨论的是这样的东西:

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
 ... 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);

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-12 22:29:43

就像成员变量一样,基类使子对象嵌入到派生类的所有实例中。基类的成员函数对于派生类不是重复的,而是在与基类对应的这个子对象上调用。

编译器知道此子对象相对于整个对象的位置,并将指针算法插入到派生和基对象之间的指针(或引用)之间的任何位置(可能是隐式的)。这包括传递给基类型的成员函数的隐藏this-pointer参数。

虚拟继承有点棘手,因为偏移量可以根据派生次数最多的类型而有所不同。在这种情况下,编译器需要将偏移量作为变量存储在类实例中,以便可以在运行时查找(就像指向虚拟成员函数的指针一样,可能还涉及另一个间接层以节省空间)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17617139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档