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