C++ RTTI中dynamic_cast的用法
我們知道在C++中基類的指標和引用可以指向派生類,因為這是安全的,派生類一定包含了基類
需要的所有的屬性和方法,這是向上轉換,我們同時還知道虛擬函式可以隨著指標和引用指向的
物件不同而使用不同的方法,這是虛擬函式的自適應。
打個例子:
testb *p;
testc a(1,2);
testb b(1);
p可以指向派生類
p= &a;
p->show() 為派生類的testc::show();
p可以指向基類
p=&b;
p->show() 為基礎類的testb::show();
因為show()虛擬函式,這樣是可以完成。
但是我們考慮另外一種情況
testb *p;
testc a(1,2);
p= &a;
p->show2(); 是否能夠按照我們預想的呼叫到testc::show2()呢
答案是否定的,因為show2()根本就不是虛擬函式.只有虛擬函式才有這樣的自適應性,也就是根據指向物件的不同而呼叫合適的方法。
那麼我們是否可以
(testc* )p;
這樣處理呢,因為我們知道p指向是一定testc的派生類,我們將p指標轉換後為testc*是安全的,這樣處理是可以的。
這裡談到了安全,什麼時候是不安全的呢?考慮如下情況:
testb *p;
testb b(1);
p= &b;
(testc* )p;
這就是不安全的,因為做強制轉換將指向基礎類 testb的指標轉換為派生類testc指向那麼void show2(void) const是不存在的。
當然這裡我們可以人為判斷,但是不是任何時候都可以這樣,比如程式大了過後。我們需要一種方法來完成這樣的判斷工作,
那麼引入了RTTI dynamic_cast
dynamic_cast<Type *>(pt)
成功pt轉換為Type型別指標失敗返回0及空指標。
最後演示一下用法標頭檔案就是剛才給出的
輸出:
dynamic check cast of q1 failed!!
test2:100
1
沒有問題testc *q1 = dynamic_cast<testc*>(p);
返回了一個空指標返回了dynamic check cast of q1 failed!!
第二個
需要的所有的屬性和方法,這是向上轉換,我們同時還知道虛擬函式可以隨著指標和引用指向的
物件不同而使用不同的方法,這是虛擬函式的自適應。
打個例子:
點選(此處)摺疊或開啟
-
class testb
-
{
-
private:
-
int a;
-
public:
-
testb(int ai){a=ai;}
-
virtual void show(void) const
-
{
-
cout<<a<<endl;
-
}
-
virtual ~testb(){}
-
};
-
-
-
class testc:public testb
-
{
-
private:
-
int b;
-
public:
-
testc(int ai,int bi):testb(ai),b(bi){}
-
virtual void show(void) const
-
{
-
cout<<"test:"<<b<<endl;
-
}
-
void show2(void) const
-
{
-
cout<<"test2:"<<b<<endl;
-
testb::show();
-
}
-
virtual ~testc(){}
- };
testb *p;
testc a(1,2);
testb b(1);
p可以指向派生類
p= &a;
p->show() 為派生類的testc::show();
p可以指向基類
p=&b;
p->show() 為基礎類的testb::show();
因為show()虛擬函式,這樣是可以完成。
但是我們考慮另外一種情況
testb *p;
testc a(1,2);
p= &a;
p->show2(); 是否能夠按照我們預想的呼叫到testc::show2()呢
答案是否定的,因為show2()根本就不是虛擬函式.只有虛擬函式才有這樣的自適應性,也就是根據指向物件的不同而呼叫合適的方法。
那麼我們是否可以
(testc* )p;
這樣處理呢,因為我們知道p指向是一定testc的派生類,我們將p指標轉換後為testc*是安全的,這樣處理是可以的。
這裡談到了安全,什麼時候是不安全的呢?考慮如下情況:
testb *p;
testb b(1);
p= &b;
(testc* )p;
這就是不安全的,因為做強制轉換將指向基礎類 testb的指標轉換為派生類testc指向那麼void show2(void) const是不存在的。
當然這裡我們可以人為判斷,但是不是任何時候都可以這樣,比如程式大了過後。我們需要一種方法來完成這樣的判斷工作,
那麼引入了RTTI dynamic_cast
dynamic_cast<Type *>(pt)
成功pt轉換為Type型別指標失敗返回0及空指標。
最後演示一下用法標頭檔案就是剛才給出的
點選(此處)摺疊或開啟
-
#include<iostream>
-
#include"dynamic_cast.h"
-
using namespace std;
-
-
-
int main(void)
-
{
-
testb *p;
-
testb a(1);
-
testc b(1,100);
-
p=&a;
-
-
testc *q1 = dynamic_cast<testc*>(p);
-
if(!q1)
-
{
-
cout<<"dynamic check cast of q1 failed!!"<<endl;
-
}
-
else
-
{
-
q1->show2();
-
}
-
-
p=&b;
-
-
testc *q2 = dynamic_cast<testc*>(p);
-
if(!q2)
-
{
-
cout<<"dynamic check cast of q2 failed!!"<<endl;
-
}
-
else
-
{
-
q2->show2();
-
}
-
-
- }
輸出:
dynamic check cast of q1 failed!!
test2:100
1
沒有問題testc *q1 = dynamic_cast<testc*>(p);
返回了一個空指標返回了dynamic check cast of q1 failed!!
第二個
testc *q2 = dynamic_cast<testc*>(p);
正常完成因為這個時候p指向是testc b(1,100);
正常完成因為這個時候p指向是testc b(1,100);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2124368/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ 中dynamic_cast<>的用法C++AST
- 模擬標準c++中的RttiC++
- C++中static_cast, dynamic_cast, const_cast用法/使用情況及區別解析C++AST
- c++中::的用法C++
- C++中& 的基本用法C++
- C++ 中特殊的用法C++
- C++中const的用法C++
- C/C++中的new/delete、構造/解構函式、dynamic_cast分析C++delete函式AST
- C++中clock用法C++
- RTTI
- C++中函式呼叫的用法C++函式
- c++中stack、queue、vector的用法C++
- C++中dynamic_cast與static_cast淺析與例項演示C++AST
- C++中const的簡單用法C++
- C++中巨集定義#define的用法C++
- c++中&符號的幾種用法C++符號
- C++中push_back()函式的用法C++函式
- C++之static_cast,dynamic_cast,const_castC++AST
- dynamic_castAST
- C++ 中 inline 用法概述C++inline
- C++ 中 this 指標的用法詳解C++指標
- C++中const用法總結C++
- C++物件模型之七 模板 異常 RTTI筆記 (轉)C++物件模型筆記
- c++中冒號(:)和雙冒號(::)的用法C++
- Java中執行時型別識別RTTIJava型別
- C++中break和continue的用法和區別C++
- C++ 中隨機函式 rand() 和 srand() 的用法C++隨機函式
- 詳解C++的模板中typename關鍵字的用法C++
- 標準 C++ 中的 string 類的用法總結C++
- 詳解 C++ 的模板中 typename 關鍵字的用法C++
- c++ 中vector 常見用法(給初學者)C++
- C++ 中名稱空間的 5 個常見用法C++
- c++ map用法C++
- C++ 函式 realloc 的用法C++函式
- C++引用的作用和用法C++
- 【C++ STL】Set用法C++
- C++中行內函數的用法C++函數
- C++ new用法的個人見解C++