2

有人可以解釋關於C++對象模型的這個理論問題嗎?這是我最近的一次考試,我被它困住了。將元類級別添加到C++對象模型

問題: 注意到Java,C#和Smalltalk的成功,C++標準委員會決定爲該語言的對象模型增加一個額外的級別。也就是說,每個類都應該有一個在運行時具有表示形式的元類。

  1. 反對者說這與語言的基本原理之一相矛盾。哪一個?說明。

  2. 對手也聲稱C++有一個額外的「半級」,允許完整的元類級別的一些功能。這是什麼「半個層次」,什麼樣的類型享受它的能力?

  3. 支持者提出了一個成功的論點。添加一個級別將爲標記階段提供對Mark &掃描垃圾回收的支持(其中所有可訪問的對象首先被標記,然後釋放不可訪問的對象)。他們的論點依賴於額外層面的哪些特徵?

  4. 此外,支持者提出了另一個論點。即使沒有垃圾收集系統,額外的級別也會使虛擬析構函數變得冗餘。說明何時以及爲什麼需要虛擬析構函數,以及額外的級別如何消除該要求?

+0

請解釋哪些部分?你懂什麼,你有什麼不明白的地方?你會回答什麼? (如果你對此的回答是「我不知道該怎麼回答」,向你解釋這將需要教大量的C++,從而使這個問題的方式過於寬泛) –

+0

所以你在考試期間無法回答這個問題。很公平。但是你現在擁有所有的資源,包括完整的互聯網。你自己回答這些問題有多遠? – Bart

+0

我在考試中實際回答了一些問題。我相信問題1)是關於C++是靜態類型的,因此,元類運行時惡意代碼會違反該主體。對於2),我回答了C++中的模板/泛型可能會提供這種「半級」功能。第3和第4部分是我有點失落的地方。 –

回答

3

因爲我沒有在你的課程,我只能猜測:

1:C++是一種樂高套件 - 你把你需要什麼,你可以離開一切。你也不必爲此付錢。添加這個額外的級別需要一些初始化和東西,我想你不能選擇不使用它 - 即使你不需要它。

2:RTTI用於與虛表

3類:在這裏,我只能猜測 - 我假定一個類的所有實例都是由元類某種程度上到達或可通過掃描所述存儲器進行檢測。如果是這種情況,則可以實施標記&掃描。

4:如果您通過具有基類之一類型的指針銷燬類實例,則需要虛擬析構函數。如果你可以從每個實例到達元類,那麼你可以調用正確的析構函數,而不需要在vtable中查找它。

+0

我認爲你大概是2,3,4。對於#1,它可能是C++是靜態類型的,而元類違反了這一點?我認爲你對#1的回答也是正確的,只是不確定他們是否在尋找。 –

+0

我不認爲這個元類違反了靜態類型。它們「僅」是已經允許dynamic_cast的RTTI的增強版本。仍然不像在運行時查詢類型是否可以調用方法。 –