2012-09-25 42 views
0

如果我們看到下面的代碼,fun函數會將C的對象轉換爲B的對象並調用B的自己的函數。它怎麼不給segm過錯。我認爲這會導致崩潰。 我的程序沒有崩潰。任何人都可以解釋爲什麼它工作正常。Regular cast doesnot throw runtime error

#include<iostream> 
using namespace std; 
class A{ 
public: 
    A() {cout<<"A's Con\n"; } 
    ~A() {cout<<"A's De\n"; } 
}; 
class B :public A 
{ 
public: 
    B() {cout<<"B's Con\n"; } 
    ~B() {cout<<"B's De\n"; } 
    void printb(){cout<<"B print function\n";} 
    void printb2(){cout<<"B print2 function\n";} 
}; 
class C :public A 
{ 
public: 
    C() {cout<<"C's Con\n"; } 
    ~C() {cout<<"C's De\n"; } 
    void printc(){cout<<"C print function\n";} 
}; 
void fun(A *ap) 
{ 
    B *bp = (B*) ap; 
    bp->printb2(); 
} 

int main() 
{ 
    C c; 
    fun(&c); 
    return 0; 
} 
+0

未定義的行爲,任何事情都可能發生。 –

+0

正確的縮進和正確的英語將有助於 –

+0

sry ..我沒有專心寫很多 – ranganath111

回答

2

您正在調用未定義的行爲。關於未定義行爲的第一條規則是什麼都可能發生。您的程序可能會崩潰,或者它可能成功運行。它可能出現成功工作,然後以「不可能」的方式幾小時後崩潰。它甚至可能發送不適當的電子郵件給你的老闆或擦除你的硬盤。這對於一個隨機的良性錯誤當然是不可能的,但是如果你的程序是一個網頁瀏覽器,它肯定可以被利用來做任何攻擊者可能想要的東西。

永遠不要依賴未定義的行爲。始終解決下屬問題。使用諸如Valgrind,Application Verifier等工具來幫助您捕獲不總是導致崩潰的細微錯誤。從長遠來看,它將使您的軟件更加可靠。

+0

非常感謝。我們可以在檢查對象的typeid後使用靜態轉換(使用RTTI)我是否正確? – ranganath111

+0

嗨...任何人都可以建議如何編寫代碼以滿足上述要求 – ranganath111

相關問題