2016-04-21 92 views
1
class I1 {}; 
class I2 {}; 
class C : public I1, public I2 {}; 
C c; 
I1 *i = static_cast<I1*>(&c); 
C *p = static_cast<C*>(i); 

我想了解對象指針和接口指針之間的轉換是否安全。指針類,實現多個接口

  • 上述代碼是否錯誤?對象切片有問題嗎?爲什麼?

  • static_cast這裏是否適當投下?

  • ip的二進制表示是否相同?

回答

1

您的代碼是確定的。沒有切片,因爲你在投射指針,而不是類型。需要注意的是中投甚至沒有在這裏需要:

I1 *i = static_cast<I1*>(&c); 

static_cast是另一個方向的適當轉換:

C *p = static_cast<C*>(i); 

如果你的接口類有虛方法(他們通常會在一個真正的程序),你也可以使用dynamic_cast如果您不確定的i,直到運行時類型:

if (C *p = dynamic_cast<C*>(i)) { 
    // use p 
} 

的POI nt dynamic_cast是它使用RTTI來查明演員是否有效。如果不是,它將返回null。如果使用static_cast,並且該類型在運行時不正確,則表明您的行爲未定義。

派生類指針的二進制值可能與其第一個基類的二進制值相同,但不是其第二個基類的二進制值。但是你不應該關心這樣的實現細節。