在我的代码中,我使用了三个类。请参阅下面的实现:
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;
}
输出:调用到 Pain 的 call()
但是,如果我将 Pain::call() 设为虚拟(Medicine::call() 是真实的),那么调用将转到 Comb 的 call()。没有任何问题!
但是当我做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() 是否为虚拟无关)。为什么会这样?