基類和派生類中使用static_cast和dynamic_cast進行類型轉換

先看代碼:ios

#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
~A

pBB和pBAB沒有任何問題,其自己就是B對象。pBA是從基類轉換爲B對象,可是調用的倒是A::Print(),由於pA對象並無構建B對象的內存,構建的僅是基類的內存,所以輸出基類的print()。spa

如今改動代碼,將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進行類型轉換:code

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);io

A* pA = new B();

B* pB = dynamic_cast<B*>(pA);

if (pB != nullptr) {

    pB->dosomething();

}

相關文章
相關標籤/搜索