爲了更好地理解我的問題,我指的是「C++編程語言第4版」第27章2.1節中討論的主題。爲什麼原始數組的多態類型是危險的
作者正在討論多態類型和內置數組的危險。 他給出了下面的例子:
void maul(Shape∗ p, int n) // Danger!
{
for (int i=0; i!=n; ++i)
p[i].draw(); //looks innocent; it is not
}
void user()
{
Circle image[10]; // an image is composed of 10 Circles
// ...
maul(image,10); // ‘‘maul’’ 10 Circles
// ...
}
我們被告知外形尺寸是4和Circle繼承形狀,並添加一個額外的2名成員,中心和半徑增加了文字大小,因此,一個抽象的大小, sizeof(Circle)>sizeof(Shape)
。 現在作者解釋了該給定例如以下觀點:
user() view: image[0] image[1] image[2] image[3]<br/>
maul() view: p[0] p[1] p[2] p[3]
的p[1].draw()
呼叫(強調P []中,P [0],它會調用正確的函數)將失敗,因爲沒有虛擬函數指針在預期的地方。
現在我知道虛擬函數表是如何工作的,但我不明白類型或其佈局的大小如何影響虛擬函數調用?當編譯器看到一個虛函數調用不與它類似的東西取代它:
p[1]._vfptr->draw_impl();
假設我是對的,怎麼會是派生對象的大小/它的佈局打破了呼籲它。
當你甚至沒有「Circle」對象的正確地址時,你會如何做一個虛函數調用? – Brian
你明白'image + 1!= p + 1'嗎? – Jarod42
謝謝你解釋,我已經閱讀過有關切片的知識,它對我來說很清楚。 –