2010-03-28 121 views
11

對於下面的C++程序:派生類和基類之間指針指針的轉換?

class Base { }; 

class Child : public Base { }; 

int main() 
{ 
    // Normal: using child as base is allowed 
    Child *c = new Child(); 
    Base *b = c; 

    // Double pointers: apparently can't use Child** as Base** 
    Child **cc = &c; 
    Base **bb = cc; 

    return 0; 
} 

GCC產生的最後一個賦值語句以下錯誤:

error: invalid conversion from ‘Child**’ to ‘Base**’ 

我的問題是兩個部分:

  1. 爲什麼沒有從子**到基**的隱式轉換?
  2. 我可以使這個例子與C風格演員或reinterpret_cast工作。使用這些鑄件意味着扔掉所有類型的安全。有什麼我可以添加到類定義,使這些指針隱式投射,或者至少短語轉換的方式,允許我使用static_cast而不是?
+0

許多編程語言在這個問題上的變化是SO上最常見的問題之一。但是即使對於相同的語言,每個人的用語都略有不同,因此找到重複的內容可能很困難。 – 2010-03-28 09:33:12

+0

「固定」這個例子以避免陰影轉換將取決於你爲什麼首先使用指針指針。 – aschepler 2012-07-24 18:52:06

回答

19

如果這是允許的,你可以這樣寫:

*bb = new Base; 

而且c最終會指着Base一個實例。壞。

+0

小修正 - 他可以說** ** bb = new Base();'只是'* bb'將不被允許。 – Phil 2010-03-28 09:38:54

+4

@Phil:'new'返回一個指針,它是'* Base'類型。 'bb'的類型是'** Base'。因此'* bb'是正確的解引用級別。 – Amber 2010-03-28 09:43:53

+1

基本原理與關於'char **'和'char const **'非等價的comp.lan.gc FAQ基本相同:http://c-faq.com/ansi/constmismatch.html – 2010-03-28 10:30:42

相關問題