[英]C++ derived-class members after downcasting
我最近在 C++ 中了解了向上轉換和向下轉換。 但是,在閱讀有關向下轉換的過程中,我提出了一些問題。 假設我有兩節課
class Base {
public:
virtual void foo() {}
};
class Derived : public Base {
public:
Derived(int i) {
mem = i;
}
int mem;
};
我的問題如下:
Derived d(1)
,向上轉換到 Base class,然后向下轉換回 Derived class,是否保留'mem==1'? 我仍然可以訪問它嗎? 假設使用了指針或引用,因此 object 切片不會發生,並且 dynamic_cast 用於向下轉換。經過一些簡單的實驗,1 似乎是正確的。
但是對於 2,我似乎無法從 Base class 指針開始並將其動態轉換為派生的 class 指針,因為 dynamic_cast 返回 null。
我從另一篇文章中讀到“但是 dynamic_cast 的基本點是它首先檢查指針 object 是否真的屬於派生類型,然后返回指向它的指針,或者如果指針 ZA8CFDE6331BD49EB2AC9Z6F891 實際上是返回 null 指針屬於(或派生自)請求的目標類型。 ”
這是否是說我們實際上不能從基礎 class 開始並簡單地將其向下轉換為派生 class,而是 dynamic_cast 的全部意義在於“回退”已經向上轉換的東西?
這取決於; 如果將Derived
object 轉換為Base
,則結果是通過省略不在Base
中的字段創建的新 object 。 但是,如果將指針轉換為Derived
(即Derived*
),則結果是指向相同 object 但類型為Base*
的指針。
這取決於; 如果您強制轉換Base
object ,則會出現編譯錯誤,除非您重載類型轉換運算符以執行此類操作(您已正確觀察到字段的值否則將是未定義的)。 但是,如果將Base*
(指針)轉換為Derived*
(使用dynamic_cast<Derived*>(p)
),則結果取決於指針指向的 object。 如果它指向Derived
class(或其子類)的實例,則結果是指向該 object 的Derived*
指針; 否則,您將獲得Derived*
類型的nullptr
指針。
當您進行轉換時,您只是告訴編譯器,“相信我並將其視為 X 類型”——沒有生成實際代碼,沒有進行分配,沒有任何實際變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.