在我的代碼中,我使用了三個類。請參閱下面的實現:在繼承中使用刪除的意外行爲,基指針對象指向派生類最多
class Medicine
{
int a;
}
class Pain:public Medicine
{
int b;
}
class Comb:public Pain
{
string salt,com;
}
所有類都只有參數化構造函數。 而call()
就像
call()
{
cout<<"You are in class the_name_of_the_class"<<endl;
}
我已經定義了名稱相同,call()
功能,在所有的人。 (他們不聲明爲虛擬至今)
的代碼是這樣:
int main()
{
Pain *p[2];
p[0]= new Comb("Salt","Com",2,110);
p[1]= new Comb("SALT","COM",1,100);
p[0]->call();
delete p[0];
delete p[1];
return 0;
}
輸出:呼叫轉到疼痛的call()
但是,如果我做痛::調用()作爲虛擬的(Medicine :: call()是真實的),然後調用去看Comb的調用()。沒有任何問題!
但是當我做Medicine *p[2]
,而不是Pain *p[2]
, 以下錯誤是發生
*** glibc detected *** ./a.out: free(): invalid pointer: 0x00000000022ed078 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3b64a760e6]
./a.out[0x400efe]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x3b64a1ecdd]
./a.out[0x400b79]
======= Memory map: ========
更多的東西放在這裏,並與
Abort(core dumped)
爲什麼那麼這個結局?當我爲Medicine :: call()使用virtual時,這又會消失(此問題與Pain :: call()是否爲虛擬無關)。這是爲什麼發生?
你能稱之爲真正的「醫學/疼痛/梳理」類嗎? – billz
你可以發佈一些重現問題的最小代碼嗎? – juanchopanza
我無法得到你。請詳細說明。 – Smith