基类和派生类中使用static_cast和dynamic_cast进行类型转换
2019獨角獸企業重金招聘Python工程師標準>>>
先看代碼:
#include <iostream>using namespace std;class A { public:A() {cout << "A" << endl;}virtual ~A() {cout << "~A" << endl;}virtual void print() {cout << "A::Print()" << endl;} };class B : public A { public:B(int i) : index(i) {cout << "B" << endl;}virtual ~B() {cout << "~B" << endl;}virtual void print() {cout << "B::Print(),index=" << index << endl;}int index; };int main(int argc, char *argv[]) {A* pA = new A();B* pB = new B(1);A* pAB = new B(5);B* pBA = static_cast<B*>(pA);B* pBB = static_cast<B*>(pB);B* pBAB = static_cast<B*>(pAB);if (pBA) {pBA->print();}if (pBB) {pBB->print();}if (pBAB) {pBAB->print();}delete pA;delete pB;return 0; }執行結果:
A A B A B A::Print() B::Print(),index=1 B::Print(),index=5 ~A ~B ~ApBB和pBAB沒有任何問題,其本身就是B對象。pBA是從基類轉換為B對象,但是調用的卻是A::Print(),因為pA對象并沒有構建B對象的內存,構建的僅是基類的內存,因此輸出基類的print()。
現在改動代碼,將A中的print函數去掉:
class A { public:A() {cout << "A" << endl;}virtual ~A() {cout << "~A" << endl;}/*virtual void print() {cout << "A::Print()" << endl;}*/ };程序在A::print()處崩潰!因為基類已經沒有print()函數了。這里的pBA類型轉換是由基類構造的對象變為派生類的指針,隱藏一個嚴重的程序BUG,但是編譯器并沒有在這里給與任何提示,還轉換成功,得到了相應的B對象指針。
接下來使用dynamic_cast進行類型轉換:
B* pBA = dynamic_cast<B*>(pA);B* pBB = dynamic_cast<B*>(pB);B* pBAB = dynamic_cast<B*>(pAB);程序調試結果,pBA轉換后為0,并沒有轉換成功,就可以在這里對轉換對象進行判斷。
因此在使用基本類型進行轉換時,用static_cast,在涉及到對象之間的轉換時用dynamic_cast。
float val = 10.00f;
int iVal = static_cast<int>(val);
A* pA = new B();
B* pB = dynamic_cast<B*>(pA);
if (pB != nullptr) {
? ? pB->dosomething();
}
轉載于:https://my.oschina.net/u/3489228/blog/1571524
總結
以上是生活随笔為你收集整理的基类和派生类中使用static_cast和dynamic_cast进行类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 私有网盘nextcloud 12的问题处
- 下一篇: Django_ORM数据表查询总结