2013-04-30 60 views
0

編譯下面的代碼是成功的,它不運行,雖然我認爲,因爲指針p可能有virtual ptrvptr可能沒有任何東西,這就是爲什麼它編譯,無法運行或有東西像沒有vptr正在創建,因爲這裏沒有其他類不是抽象類。abstact類類型指針的編譯是成功的嗎?

class one { 
    int a; 
    public: 
    one(){a=0;}; 
    virtual void get()=0; 
}; 

int main() { 
    one *p; 
    p->get(); 
} 
+0

是否有任何錯誤消息或什麼? – smttsp 2013-04-30 08:15:29

+0

C++中沒有「虛擬ptr」。通過專注於八卦和傳聞,而不是真正的C++,你已經錯過了一個更基本的問題。 – 2013-04-30 08:16:17

+0

我想沒有對象這麼虛擬指針?因此運行失敗 – 2013-04-30 08:16:45

回答

4

你不初始化p,這意味着它指向一個隨機的內存位置。解引用它是未定義的行爲,很可能是崩潰。

+0

所以我想編譯是成功的,因爲它已經運行時綁定,並在運行時沒有返回 – 2013-04-30 08:19:27

+0

@PraveenKumar只是一個建議:如果你不初始化你的指針某些「有效位置」,至少分配它'NULL','0'或'nullptr'。當您取消引用指針時,運行時檢測到的錯誤比任何其他隨機位置更有可能。 – 2013-04-30 08:23:14

+0

是的,好吧,我的問題是爲什麼它是一個成功的編譯 – 2013-04-30 08:24:18

0

p的值不是有效的指針,因爲它不是任何對象的地址。解除引用p是未定義的行爲。

+0

所以我想編譯是成功的,因爲它已經運行時綁定,並在運行時沒有得到返回 – 2013-04-30 08:22:25

+4

@PraveenKumar:它。具有。沒有。至。做。有了。運行時綁定。真的,男人。它關於指針*的基本屬性。 – 2013-04-30 08:38:55

+0

@PeteBecker:你說的對,那不是正確的名詞。只是「有效」應該是我所追求的。 – 2013-04-30 12:01:49