C++支持继承。
但是它是如何在编译器中实现的呢?
编译器是否将所有实现从父级复制并粘贴到子级?
发布于 2013-07-12 22:38:11
非常简单,如果我们讨论的是这样的东西:
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);如果我们在讨论虚函数,那么编译器将生成一个表,其中包含各个虚函数的地址,并且基于类似的“查找存在于this类或其父类之一中的函数”的原则,为每个类生成该表。
在上面的代码中,我忽略了一个类可以有多个“父”类的事实--它不会改变事情的工作方式,只是代码必须维护“同一级别的多个类”的列表或数组。
发布于 2013-07-12 22:29:43
就像成员变量一样,基类使子对象嵌入到派生类的所有实例中。基类的成员函数对于派生类不是重复的,而是在与基类对应的这个子对象上调用。
编译器知道此子对象相对于整个对象的位置,并将指针算法插入到派生和基对象之间的指针(或引用)之间的任何位置(可能是隐式的)。这包括传递给基类型的成员函数的隐藏this-pointer参数。
虚拟继承有点棘手,因为偏移量可以根据派生次数最多的类型而有所不同。在这种情况下,编译器需要将偏移量作为变量存储在类实例中,以便可以在运行时查找(就像指向虚拟成员函数的指针一样,可能还涉及另一个间接层以节省空间)。
https://stackoverflow.com/questions/17617139
复制相似问题