私のコードでは、3 つのクラスを使用しました。以下の実装を参照してください。
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() に行きます
ただし、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() が virtual であるかどうかとは関係ありません)。なぜこうなった?