簡體   English   中英

向下轉換后的 C++ 派生類成員

[英]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;
};

我的問題如下:

  1. 如果我創建一個 object Derived d(1) ,向上轉換到 Base class,然后向下轉換回 Derived class,是否保留'mem==1'? 我仍然可以訪問它嗎? 假設使用了指針或引用,因此 object 切片不會發生,並且 dynamic_cast 用於向下轉換。
  2. 當從基礎 class 向下轉換到派生 class 時,會有一個額外的成員變量“mem”。 memory 是否在運行時分配給“mem”(使用 dynamic_cast)? 它將被初始化為什么值?

經過一些簡單的實驗,1 似乎是正確的。

但是對於 2,我似乎無法從 Base class 指針開始並將其動態轉換為派生的 class 指針,因為 dynamic_cast 返回 null。

我從另一篇文章中讀到“但是 dynamic_cast 的基本點是它首先檢查指針 object 是否真的屬於派生類型,然后返回指向它的指針,或者如果指針 ZA8CFDE6331BD49EB2AC9Z6F891 實際上是返回 null 指針屬於(或派生自)請求的目標類型。

這是否是說我們實際上不能從基礎 class 開始並簡單地將其向下轉換為派生 class,而是 dynamic_cast 的全部意義在於“回退”已經向上轉換的東西?

  1. 這取決於; 如果將Derived object 轉換Base ,則結果是通過省略不在Base中的字段創建的新 object 。 但是,如果將指針轉換為Derived (即Derived* ),則結果是指向相同 object 但類型為Base*的指針。

  2. 這取決於; 如果您強制轉換Base object ,則會出現編譯錯誤,除非您重載類型轉換運算符以執行此類操作(您已正確觀察到字段的值否則將是未定義的)。 但是,如果將Base*指針)轉換為Derived* (使用dynamic_cast<Derived*>(p) ),則結果取決於指針指向的 object。 如果它指向Derived class(或其子類)的實例,則結果是指向該 object 的Derived*指針; 否則,您將獲得Derived*類型的nullptr指針。

當您進行轉換時,您只是告訴編譯器,“相信我並將其視為 X 類型”——沒有生成實際代碼,沒有進行分配,沒有任何實際變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM