簡體   English   中英

編譯器如何實現C ++繼承?

[英]How do compilers implement C++ inheritance?

C ++支持繼承。

但是如何在編譯器中實現呢?

編譯器是否將所有實現從父級復制並粘貼到子級?

就像成員變量一樣,基類使子對象嵌入到派生類的所有實例中。 對於派生類,基類的成員函數不重復,而是在與基類相對應的此子對象上調用它們。

編譯器知道哪里這個子對象位於相對於所述完整的對象,並且將插入指針運算處處有指針(或參考)之間的流延(可能隱含的)衍生和基地。 這包括傳遞給基本類型的成員函數的隱藏的this -pointer參數。

虛擬繼承有些棘手,因為偏移量可能取決於最派生的類型而有所不同。 在這種情況下,編譯器需要存儲偏移為類的實例,因此它可以在運行時被抬起頭內的變量(就像指針虛擬成員函數,則可能是涉及以節省空間的間接另一個層)。

如果我們正在談論這樣的事情,則將其簡化:

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);

如果我們談論的是虛函數,那么編譯器將生成一個表,其中包含相應虛函數的地址,並且基於“查找存在於此類中的函數”的相似原理,為每個類生成該表。或其父母之一)。

[在上面,我忽略了一個類可以具有多個“父”類的事實-它不會改變事物的工作方式,只是代碼必須維護“更多類”的列表或數組。同一級別”]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM