簡體   English   中英

如何使用 dynamic_cast

[英]How to use dynamic_cast

我正在嘗試使用 dynamic_cast - 沒有成功。 我有一個 BASE 類和一個從 BASE 派生的 A 類。 我想要一個指向 BASE 類對象的指針,稍后我想將其轉換為 A 類。我顯然沒有正確執行此操作。 以下代碼編譯:

#include <cstdio>

class BASE {
private:

    int i;

public:

     BASE(void) {i = 1; }
     virtual ~BASE(){}

     virtual void id() { printf("CLASS BASE\n"); }
 };

class A : public BASE {
public:
    A(void): BASE() {}
    A(const BASE & base) : BASE(base) {}
    A& operator = (const BASE & base) { static_cast<BASE&>(*this) = base; return *this; }

    void id() override { printf("CLASS A\n"); };
};


int main() {

    BASE* base = new BASE();

    base->id();

    A* a = new A(*base);

    a->id();

    A* anotherA = dynamic_cast<A*>(base);

    if(!anotherA) 
        printf("anotherA is NULL\n");
    else    
        anotherA->id();
}

但運行它會給出:

CLASS BASE
CLASS A
anotherA is NULL

我確定我遺漏了一些非常基本的東西,但我一直盯着代碼看,看不出我做錯了什么。 任何幫助將不勝感激。

我看過

什么時候應該使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

但不明白為什么 dynamic_cast 不起作用 - 這不是一個簡單的向下轉換嗎?

我確定我錯過了一些非常基本的東西

你做。

當您有一個A類型的對象和一個指向A*類型對象的指針時,該指針可以轉換為BASE*類型。 這種轉換部分地忘記了有關類型的信息。

現在給定一個BASE*類型的指針,如果這個指針實際上指向一個A對象(也就是說,它在某個時候從A*類型轉換而來),您可以通過將指針轉換回A*類型來回憶忘記的類型信息。

如果您的指針開始時沒有指向類型為A的對象,那么什么都沒有忘記,也沒有什么可回憶的。

暫無
暫無

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

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