new返回的派生類的指針可以類型強制轉換爲其基類的指針。可以將派生類的指針類型轉換爲其基類的指針嗎?
這是真的還是假的?
我知道dynamic_cast可以用來演繹下行。通常,如何將派生類的指針轉換爲其基類的指針?
new返回的派生類的指針可以類型強制轉換爲其基類的指針。可以將派生類的指針類型轉換爲其基類的指針嗎?
這是真的還是假的?
我知道dynamic_cast可以用來演繹下行。通常,如何將派生類的指針轉換爲其基類的指針?
是的。從指針轉換爲派生類到指向基類的指針是隱含的。因此,以下內容完全正確:
struct B { };
struct D : B { };
D* my_d_ptr = new D;
B* my_d_ptr_as_a_b_ptr = my_d_ptr;
+1:但是,爲了讓初學者更清楚,我只是指出相反情況並非如此,並且upcasts本質上是不安全的,即「B * b = new D();」是安全的,但是「D * d = new B()」不是。謝謝。 – 2010-01-28 16:34:45
@Binary Worrier:上傳非常安全。向下轉換需要'dynamic_cast'。(D - > B = upcast; B - > D = downcast) – 2010-01-28 16:36:41
@Binary Worrier:真的,但OP似乎已經知道(「我知道dynamic_cast可以用來向下推演」)。 – 2010-01-28 16:37:30
將指針指向派生到指向基的指針應該是隱式的。這是多態性的要點:派生類的實例應始終安全地用作基類的實例。因此,不需要明確的演員。
那如果派生的真正的類繼承「公開」,並從基地「非虛擬」:
您不能轉換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
}
編輯:添加代碼示例,加入曖昧使用的情況下,除去虛擬繼承的例子。
這個答案似乎困惑。你的意思是你不能轉換,如果繼承是私人或虛擬的? – 2010-01-28 16:37:13
謝謝你的評論。我將添加代碼示例。 – 2010-01-28 16:50:33
我認爲你的意思是「虛擬」,因爲你的例子是「非虛擬的」並且失敗了。 MSDN:「當指定的基類是可訪問的,並且轉換是明確的」 – 2015-04-21 19:17:42
你的問題不清楚,因爲它混合了幾個不同的東西。
一方面,派生類的指針可以將轉換爲指向基類的指針(假設基類是可訪問的)。這是一種自然轉換,不需要任何演員來完成。
另一方面,你提到dynamic_cast
和它的執行downcasts的能力。但是向下轉換的方向相反:從指向基類的指針到指向派生類的指針。 Downcast可以由dynamic_cast
和static_cast
執行,具體取決於您需要什麼以及您需要多少運行時檢查。
......同時你在談論鑄造new
的結果,這當然只能被上傳,但不能被降級。
那麼,你問的是什麼?是向上還是向下?
@Binary Worrier:即使是一個詞「鑄造」?我認爲「cast」的過去分詞(或其他)是「cast」。 – 2010-01-28 16:33:23
..當我們在這裏時,'cast'就足夠了; '輸入'(有或沒有空格)被視爲某些學者無知的跡象。因人而異。 ;) – dirkgently 2010-01-28 16:59:17
@dirkgently:也許他認爲他可以投出其他東西,比如函數,成員,模板等,你永遠不知道。 –
pyon
2010-01-28 17:04:29