class A
{
public:
int i;
int j;
};
class B : public A
{
public:
int k;
};
main()
{
A *a = new B;
}
是否可以訪問切片數據?如何訪問對象切片?
class A
{
public:
int i;
int j;
};
class B : public A
{
public:
int k;
};
main()
{
A *a = new B;
}
是否可以訪問切片數據?如何訪問對象切片?
切片看起來是這樣的:
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
的唯一保證是它的第一個數據成員的地址與對象的地址相同。
我相信答案是向下投下指針。
static_cast<B*>(a)->k = 10;
的前提是,你實際上肯定知道,在代碼中這點a
總是指B
一個實例,因爲對於缺乏虛函數和一個虛函數表,是沒有辦法的要在運行時測試的語言,如果該類型是有效的。
技術上,還未有任何切片,你就不能以其他方式訪問它,因爲所有的編譯器知道,你有一個指向類型A的對象,而這正是你就必須知道的情況下,更好。
IMO,如果你只使用繼承來的數據字段添加到類,它是唯一有保存數據,你一般不應使用指針都搞亂基類。
如果您只顯示部分代碼,並且您確實有虛擬功能,請改爲使用dynamic_cast
,因爲可以檢查轉換是否有效。
這裏沒有對象切片。你可以說得更詳細點嗎? *訪問*對象切片的含義是什麼? – Naveen 2010-05-07 10:01:11
請參閱http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c關於 – 2010-05-07 10:02:00
的一個很好的討論@Naveen:但除非你作爲程序員保持軌道,記住它是一個B,沒有辦法知道'* a'也包含B部分,所以它和切片一樣好。 – UncleBens 2010-05-07 14:01:15