簡體   English   中英

向下轉換和虛擬功能

[英]Downcasting and Virtual Functions

在采訪中有人問我這個問題,我不確定以下情況的行為:

class A 
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};

class B : public A
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};

現在如果

A* AObj = new A;
B* BObj = (B*) AObj;

BObj是由於virtual關鍵字而訪問B的方法,還是因為它指向AObj的對象而不能訪問B的方法?

有人可以幫助我,確切說明向下轉換還會如何影響訪問嗎?

將基類對象的地址分配給派生類指針是未定義的行為 因此,一切BObj可能:調用BObj的函數可以調用B的函數,可以調用A的函數,可以使程序崩潰,甚至可以格式化硬盤。 這都取決於編譯器及其優化選項。

在這種情況下(多態),指針的類型(BObj,此處其類型不是B)是指向(A)的對象的類型。 因此BObj是基類的對象,並且無法執行已刪除類(B)中定義的額外工作 (功能)。

首先,這樣做

A* AObj = new AObj();

B* BObj = AObj;

絕對不安全,因為它會將基類對象(父類)的地址分配給派生類(子級)指針。 因此,代碼將期望基類對象具有派生類屬性。

但是,您可以這樣做:

    A* AObj = new AObj();

    B* BObj = dynamic_cast<B*>AObj;

這將檢查是否可以將Aobj分配給Bobj。 如果可以,它將返回對象的地址,否則將返回0。

因此,您可以像這樣使用它:

B* BObj = dynamic_cast<B*>AObj;
if(BObj)
{
    //Now you can use it safely.
}

暫無
暫無

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

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