派生類別雙指標到基底類別雙指標的轉換:匿名性和安全性
在C 中,指向派生類別的指標可以隱式轉換指向其基底類別的指針,這對於基於繼承的程式設計來說是一個方便的功能。然而,當涉及到雙指針時,這種隱式轉換會引起一些安全問題。
考慮以下程式碼:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { // Convert child to base (no problem) Child *c = new Child(); Base *b = c; // Convert double pointer to child to double pointer to base (error) Child **cc = &c; Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’ }</code>
GCC 正確地抱怨了最後一個賦值語句,因為從不允許隱式從 Child** 到 Base**。這是由於這些指標的性質存在根本差異:
允許Child** 隱式轉換為Base** 將違反此區別並引入潛在的安全隱患:
<code class="cpp">// After explicit cast *bb = new Base; // Child pointer now points to a Base!</code>
這可能會導致物件切片,其中子特定的資料將會遺失並且完整性受到損害。為了維護型別安全,明確禁止 Child** 和 Base** 之間的轉換。
替代轉換選項
雖然不支援隱式轉換,但還有替代方法允許派生類別和基類雙指標之間相互轉換的轉換方法:
總之,派生類雙指標和基類雙指標之間缺乏隱式轉換可以防止潛在的型別安全問題。必要時,請謹慎使用替代轉換方法,並考慮使用虛擬析構函數修改類別定義以進行動態轉換。
以上是C 中衍生類別雙指標可以隱式轉換為基底類別雙指標嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!