2010-01-28 76 views
1

new返回的派生類的指針可以類型強制轉換爲其基類的指針。可以將派生類的指針類型轉換爲其基類的指針嗎?

這是真的還是假的?

我知道dynamic_cast可以用來演繹下行。通常,如何將派生類的指針轉換爲其基類的指針?

+2

@Binary Worrier:即使是一個詞「鑄造」?我認爲「cast」的過去分詞(或其他)是「cast」。 – 2010-01-28 16:33:23

+0

..當我們在這裏時,'cast'就足夠了; '輸入'(有或沒有空格)被視爲某些學者無知的跡象。因人而異。 ;) – dirkgently 2010-01-28 16:59:17

+0

@dirkgently:也許他認爲他可以投出其他東西,比如函數,成員,模板等,你永遠不知道。 pyon 2010-01-28 17:04:29

回答

12

是的。從指針轉換爲派生類到指向基類的指針是隱含的。因此,以下內容完全正確:

struct B { }; 
struct D : B { }; 

D* my_d_ptr = new D; 
B* my_d_ptr_as_a_b_ptr = my_d_ptr; 
+2

+1:但是,爲了讓初學者更清楚,我只是指出相反情況並非如此,並且upcasts本質上是不安全的,即「B * b = new D();」是安全的,但是「D * d = new B()」不是。謝謝。 – 2010-01-28 16:34:45

+0

@Binary Worrier:上傳非常安全。向下轉換需要'dynamic_cast'。(D - > B = upcast; B - > D = downcast) – 2010-01-28 16:36:41

+1

@Binary Worrier:真的,但OP似乎已經知道(「我知道dynamic_cast可以用來向下推演」)。 – 2010-01-28 16:37:30

4

將指針指向派生到指向基的指針應該是隱式的。這是多態性的要點:派生類的實例應始終安全地用作基類的實例。因此,不需要明確的演員。

2

那如果派生的真正的類繼承「公開」,並從基地「非虛擬」:

您不能轉換Derived*Base*既含蓄,也沒有使用的static_cast/dynamic_cast的(C-投將做的工作,但在使用這個黑客之前,你應該三思而行!);

class Base { }; 

class Derived : protected Base { }; 

int main() 
{ 
    Base* b = new Derived(); // compile error 
} 

另外不工作,如果基類是不明確的:

class Base { }; 

class Derived1 : public Base { }; 
class Derived2 : public Base { }; 

class MostDerived : public Derived1, Derived2 { }; 

int main() 
{ 
    Base* b = new MostDerived(); // won't work (but you could hint compiler 
           // which path to use for finding Base 
} 

編輯:添加代碼示例,加入曖昧使用的情況下,除去虛擬繼承的例子。

+0

這個答案似乎困惑。你的意思是你不能轉換,如果繼承是私人或虛擬的? – 2010-01-28 16:37:13

+0

謝謝你的評論。我將添加代碼示例。 – 2010-01-28 16:50:33

+0

我認爲你的意思是「虛擬」,因爲你的例子是「非虛擬的」並且失敗了。 MSDN:「當指定的基類是可訪問的,並且轉換是明確的」 – 2015-04-21 19:17:42

1

你的問題不清楚,因爲它混合了幾個不同的東西。

一方面,派生類的指針可以將轉換爲指向基類的指針(假設基類是可訪問的)。這是一種自然轉換,不需要任何演員來完成。

另一方面,你提到dynamic_cast和它的執行downcasts的能力。但是向下轉換的方向相反:從指向基類的指針到指向派生類的指針。 Downcast可以由dynamic_caststatic_cast執行,具體取決於您需要什麼以及您需要多少運行時檢查。

......同時你在談論鑄造new的結果,這當然只能被上傳,但不能被降級。

那麼,你問的是什麼?是向上還是向下?

相關問題