傢伙PLZ檢查下面的代碼:爲什麼一個未初始化的指針在C++程序中起作用?
class Human
{
public:
void chat(Human h)
{
cout << "human";
}
void chat(ComputerScientist c)
{
cout << "computer";
}
};
class ComputerScientist : public Human
{
};
//Main function below
int main()
{
Human* p, p1;
//Uninitialized pointer above;
p->chat(p1); //It shows perfectly the result without ANY error!
}
然而,事情非常棘手,如果我做的派生類ComputerScientist一個函數,它覆蓋了人類的一個。
class Human
{
public:
virtual void chat(Human* h)
{
cout << "about the weather";
}
virtual void chat(ComputerScientist* c)
{
cout << "about their own computer illiteracy";
}
};
class ComputerScientist : public Human
{
public:
virtual void chat(Human* h)
{
cout << " about computer games";
}
virtual void chat(ComputerScientist* c)
{
cout << " about others’ computer illiteracy";
}
};
而且我使用相同的主函數,它似乎是空指針行中的段錯誤。但爲什麼?
事情已經做出改變,在第二個例子中兩個地方:
- 我通過使虛擬使用的首要功能。
- 該函數將一個指針作爲參數。
「C可以很容易地在腳中自我拍攝; C++使它更難,但是當你這樣做時,它會把你的整個腿部吹掉。」---由某人 – user3528438
相關:http://stackoverflow.com/ a/29151144/332733 – Mgetz
另請注意,在'human * p,p1;'中只有'p'是一個指針。如果你希望兩個都是指針,那麼使用'human * p,* p1;' – rpsml