2014-09-01 20 views
-2

讓我們舉一個例子:是否推薦使用向下轉換來設置派生類成員變量?

class Parent{ 
} 

class Derived1:public Parent{ 
public: 
     int x; 
} 

class Derived2:public Parent{ 
public: 
     int y; 
} 

main() 
{ 
    int i; 
    std::cin >> i; 
    Parent *p; 
    switch(i) 
    { 
    case 0: 
      p = new Derived1() 
      static_cast<Derived1>(p)-> x = 1; 
      break; 
    case 1: 
      p = new Derived2() 
      static_cast<Derived2>(p)-> y = 2; 
      break; 
    } 
    process(*p); 
} 

是向下投射來設置派生類的成員變量推薦的做法?有沒有比上述更清潔的替代品?

+1

爲什麼不將成員的初始值傳遞給構造函數? – Brian 2014-09-01 05:21:31

+0

不應該是'process(p)',而不是'process(* p)'? – justanothercoder 2014-09-01 05:23:47

+0

@Brian,當然,我當然可以,只是在我的實際代碼中,我確定了Derived類的值,我不想保留臨時變量arround – Kam 2014-09-01 05:26:36

回答

1

你的鑄件錯了,你需要轉換爲指針(p是一個指針):

static_cast<Derived1*>(p) 
        ^

而且你不需要這些鑄件,剛剛分配得到的指針基礎的:

Parent *p; 
    switch(i) 
    { 
     case 0: 
     { 
       Derived1* d1 = new Derived1(); 
       d1->x = 1; 
       p = d1; 
       break; 
     } 
     case 1: 
     { 
       Derived2* d2 = new Derived2(); 
       d2-> y = 2; 
       p = d2; 
       break; 
     } 
    } 
0

首先,您的代碼已損壞。 如果您將父項轉換爲派生類型,則應該投射指針或引用。

static_cast<Derived1*>(p) 

而不是創建對象,然後設置字段,你可以將它作爲參數傳遞給構造函數。其實,只要你知道什麼類型的對象,你就可以安全地將指針投射到父對象上。但我還沒有看到有任何建議要這樣做。

相關問題