2014-12-10 50 views
2

我經常聽說編譯器在某些條件下無法確定使用方法的確切實現。 Fox示例中,我們可以想象一個場景(所以人們會說)在父類的哪個位置使用了在子類中被重寫的方法foo(),編譯器現在不會在運行時調用foo()的哪個實現。因此,我們有動態調度,vtables等概念編譯器直到運行時才確定變量的真實類型究竟出於什麼原因?

我的問題是,確切地說爲什麼可以編譯器不能確定調用的確切實現?我最近停下來思考這個問題,我一直在努力去證明它的正確性。也許我錯過了一些非常明顯的東西(當我聽到答案時,我可能會踢自己)。這是否僅限於外部環境?如果是這樣,那該怎麼玩呢?

這是一個語言相關的限制還是有一些更基本的手頭?

+1

的類型的表達式的總是在編譯時已知。你有一些代碼能夠說明你不確定的內容嗎? – 2014-12-10 22:35:58

+3

好吧,動態多態性支持的整個概念**被製作爲**以在運行時啓用類型檢測/注入。 – 2014-12-10 22:36:31

+0

編輯第一句。也許現在它更清晰了?是的,我想我已經看到這與C++。這是一個靜態類型的功能嗎? – Boon 2014-12-10 22:39:00

回答

11

想想這個:

class Base 
{ 
public: 
    virtual void some_virtual_method(){...} 
}; 
class Derived: public Base 
{ 
public:  
    void some_virtual_method() override{...} 
}; 

int choice; 
cin >> choice; // cannot know the value at compile time 

Base* foo; 

if(choice) 
{ 
    foo = new Base; 
} 
else 
{ 
    foo = new Derived; 
} 

foo->some_virtual_method(); 

有沒有辦法讓編譯器知道哪個some_virtual_method()在編譯時調用,如選擇完全取決於用戶的輸入。調度通過函數虛擬表完成,並在運行時完成。

+0

我以爲是這樣。我想我對這件事的想法太多了。謝謝 – Boon 2014-12-10 22:46:08

0

編譯器與運行時沒有任何關係,只是它準備了實際運行的機器代碼。

當對象是動態創建的,並且具有多晶型特性,並且直到在通過的函數獲得的超類型,類型不是由PROGRAM已知的參數。

相關問題