[英]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.