2010-05-07 15 views
-1
class A 
{ 
public: 
int i; 
int j; 

}; 

class B : public A 
{ 
public: 
int k; 

}; 

main() 
{ 
    A *a = new B; 

} 

是否可以訪問切片數據?如何訪問對象切片?

+4

這裏沒有對象切片。你可以說得更詳細點嗎? *訪問*對象切片的含義是什麼? – Naveen 2010-05-07 10:01:11

+1

請參閱http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c關於 – 2010-05-07 10:02:00

+0

的一個很好的討論@Naveen:但除非你作爲程序員保持軌道,記住它是一個B,沒有辦法知道'* a'也包含B部分,所以它和切片一樣好。 – UncleBens 2010-05-07 14:01:15

回答

1

切片看起來是這樣的:

struct B { 
    virtual ~B() { } 
}; 
struct D : public B { 
    int a, b; 
}; 

int main() 
{ 
    D der; 
    B bas(der); // der is sliced! 
} 

有沒有辦法讓B bas對象看D der的額外信息,即使信息是存在的。我們說這些額外的信息被「切掉」了。 bas無法訪問任何內容,因爲該標準允許D對象被任意存儲在內存中(幾乎),用於alignment的目的。 der的唯一保證是它的第一個數據成員的地址與對象的地址相同。

0

我相信答案是向下投下指針。

static_cast<B*>(a)->k = 10; 

的前提是,你實際上肯定知道,在代碼中這點a總是指B一個實例,因爲對於缺乏虛函數和一個虛函數表,是沒有辦法的要在運行時測試的語言,如果該類型是有效的。


技術上,還未有任何切片,你就不能以其他方式訪問它,因爲所有的編譯器知道,你有一個指向類型A的對象,而這正是你就必須知道的情況下,更好。


IMO,如果你只使用繼承來的數據字段添加到類,它是唯一有保存數據,你一般不應使用指針都搞亂基類。

如果您只顯示部分代碼,並且您確實有虛擬功能,請改爲使用dynamic_cast,因爲可以檢查轉換是否有效。