為什麼所謂的動態多型性只能在執行時動態繫結?

時間 2021-05-31 06:05:27

1樓:Ning Lee

最近在研究c++物件模型,也在考慮這個問題,既然編譯器都知道繼承關係了,為什麼不直接把多型轉移到編譯器解決。答案正如前面大神所言:不是每一次你都能看出來的,比如在if else中、在switch case中、在以函式指標為引數的呼叫中;另外,是不是還有可能根據外界環境的不同呼叫不同的實現(比如使用者的輸入)。

這些情況,編譯器都沒有足夠的資訊確認到底呼叫的是哪個具體的實現。所以,必須動態繫結。

2樓:Eric Qiang

類成員函式指標:

class Test; //乙個未定義的類。

std::cout <<"Test類成員函式指標長度="<

3樓:王濤

最簡單的模擬, 你乙個根據輸入或者變數的條件判斷,你靠看也看不出來會走哪個分支啊。

只有在執行時,才能唯一確定當前的物件是繼承樹的哪乙個。

內部實現請參考虛指標

4樓:圈外人己

C++有類的繼承,而且派生類物件可以當作基類物件。

class A{

public:

f1();

};class B :public A{

public:

f1();//覆蓋};…

void fun(A* a){

a->f1();}…

A* a=&b;

fun(a)

這樣用到a->f1()時編譯器並不會去確定呼叫哪個f1()方法,因為它不知道傳入的這個a到是A類的指標還是B類的指標,只有執行時才能確定a具體是什麼類的指標。

5樓:Belleve

因為 Existential Type 改寫成的 System Fω Type 不是 Rank-1 的,必然有無法消除的大 λ。

6樓:沒什麼技術

執行時動態繫結一般指在多型繼承時。請想一種情況,如果某個函式的引數是基類指標型別,那麼傳遞到這個函式的既可能是基類,也可能是子類,那麼函式中這個指標引數呼叫的成員函式就可能是基類成員函式或者子類成員函式。

又因為這個函式呼叫時傳遞的引數不確定,因此在編譯這個函式時,不能確定引數型別,就必須動態繫結了。

個人看法~

7樓:

如果程式獨自執行不受外界影響,是可以看出會執行的所有函式的。

但大多程式都會接收外界的輸入,而外界的輸入是不確定的,在這個時候,程式執行會受到輸入的影響而變成不確定的。

8樓:立強

你沒搞清楚因果關係。

1."執行時動態繫結" 這個是需求,

2.C++的動態多型性,抽象類這些東西,是實現這些需求的方法。

9樓:王晉瑋

對於通常的虛函式這種多型的實現方式,編譯器一般會盡自己所能去進行靜態繫結。但是繫結依賴到執行時資訊的話,編譯器也無能為力。

靜態多型性的一種寫法,不依賴虛函式來實現多型,語法上保證只能用在編譯期可推斷出繫結的場景下:

10樓:暮無井見鈴

執行時繫結不是動態多型性的一部分嗎……

如果說虛函式的話,它不是「只能」在執行時動態繫結,也存在可以靜態繫結的情況。

你能看出來實際呼叫函式的場合,編譯器也有一定可能看出來。這時函式去虛化作為一種優化存在。

另外建構函式/析構函式中以及指明所屬類(x.ClassY::func(...))時,虛函式也被當做非虛函式處理。

但有的時候,你和編譯器都不可能看出來實際呼叫的函式——

1) 它可能是別的地方寫的

假設有個翻譯單元中某函式接受基類指標,呼叫基類虛函式。而另乙個翻譯單元給基類新增了新的子類,並有了新覆寫的虛函式。那麼若之前翻譯單元的函式無法被內聯,則只能通過執行時動態繫結的方式尋找虛函式。

2) 有執行時資訊決定物件型別的情況

譬如某個函式返回的基類指標根據執行時輸入引數指向不同的新建的子類物件。這時也無法在編譯時看出該呼叫哪個函式。

11樓:夏之幻想

動態多型性本身就指的是在執行期體現的多型性。。。

當然並不是說呼叫虛函式就肯定是在使用動態繫結,通過例項、使用限定名呼叫或者在構造或析構函式中呼叫虛函式是不會動態繫結的

12樓:d41d8c

(似乎被牆了,自己想辦法)

簡而言之,編譯器只有在知道足夠的資訊的情況下才能devirtualize乙個函式呼叫(把虛函式呼叫改寫成直接呼叫)。很多情況下,編譯器沒有足夠的資訊

SNP單核苷酸多型性跟點突變有什麼區別?

Ji Fei 不一樣,SNP的概念通常是基於人類遺傳過程中同時會擁有兩套分別來自母系和父系的基因組,就是兩套染色體,大部分序列肯定是一樣,但有的位置存在不同鹼基的差別,使得表達存在二選一的現象,這些位點就叫SNP,突變很顯然是在複製過程鹼基配對出現了錯誤,概念完全不同 看了生物資訊學後,這個概念理解...

基因多型性會不會對蛋白質功能造成很大的影響,為什麼?

法醫廖小刀 具有多型性的snp的數量對於整個人體全部的DNA量三十億對核苷酸來說,小的可憐,而且就算是有多型性,在一段基因中,乙個單核苷酸的不同,在轉錄表達的時候可能根本變化,因為這是有容錯空間的。snp在某些位置是會影響蛋白表達的結構,所以人才有膚色,瞳色,髮色,面容的差異。但是更多的是不表達的,...

Java 中的多型,為什麼子類例項能夠賦值給父類引用,反之則不行?

喬冬 父類引用指向子類物件,但實實在在所能看得到的只是屬於父類的那部分屬性和方法。變數c可以訪問到A物件的屬性和方法,這樣是可行的。記憶體圖如下 父類引用指向子類物件 假如子類引用可以指向父類物件,所能看到的是子類和父類的全部屬性和方法 記憶體圖如下 子類引用指向父類物件 正常情況 變數c可以訪問到...