簡體   English   中英

為什么沒有static_cast會失敗?

[英]Why does this fail without static_cast?

編譯f有效,但編譯g失敗並出現錯誤。

為什么會這樣?

class A {
public:
  A() {}
};

class B : public A {
public:
  B() {}
};

void f() {
  A* a = new A();
  B* b = static_cast<B*>(a);
}

void g() {
  A* a = new A();
  B* b = a;
}

static_cast強制轉換可能不安全。

B* b = static_cast<B*>(a);

這將是有效的,如果a指向的A ,實際上是一個基類子對象的對象B對象,然而事實並非如此。 演員強制轉換。

B* b = a;

這里沒有強制轉換,並且(正確地)沒有允許從基類指針到派生類指針的隱式轉換。 指向派生類的指針始終可以轉換為指向基類的指針,因為派生類對象始終包含基類子對象,但並非每個基類實例都是特定派生類類型的子對象。

嗯,是的 這樣做:

B* b = new A();

不安全。 最終得到一個指向A對象的B指針; 你永遠不會構造對象的B部分; 你的對象是“切成薄片”。

另一方面...

A* a = new B();

......會沒事的。

您正在嘗試將指針從A *轉換為B *。 我不確定你想要實現的目標。 但由於B *來自A *而不是相反,這是無效的。 也許你想做這樣的事情:

int main()
{
///The above code compiles while if I replace above two line in main with below assignment it gives error.
     A *a=new A();
    A * b=new B();

}

是的,如果要將基類分配給派生類指針類型,它確實會出錯。 不,如果您明確地轉換指針類型,它不會給出錯誤,因為在C ++中,如果您願意,您可以自己射擊。

究竟是什么令你感到困惑,或者你期望用你的代碼實現什么目標?

基類不能隱式轉換為派生類。 考慮一下

class A {
  public: int x;
};
class B : public A {
  public: int y;
};
B* b = new A; // assume it works, so 4 bytes is allocated and initialized.
b->y;         // bam! accessing unallocated  region.

暫無
暫無

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

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