对于虚拟函数,知道它的含义,也能够描述出来。参照百度百科,也就是“它提供了‘动态绑定’机制”。
可总是感觉有些迷糊,于是敲了一段代码出来试验,一探究竟(编程环境是VC6.0)。对比代码和结果,一切都不言自明。
现在把代码和结果贴上来,作为保存记录,同时也欢迎大家提出意见,以臻完善。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base class"<< endl;
print();
cout << "Base class 创建完毕"<< endl;
}
virtual void print(){ cout << "Base print" <<endl;}
virtual void cmpfl(float a,float b){cout<<(a>b?2:0)<<'\n';}
virtual ~Base(){
cout <<"Base虚构了"<< endl;
}
private:
};
class Sub:public Base
{
public:
Sub()
{
cout << "Sub class" << endl;
print();
cout << "Sub class 创建完毕"<< endl;
}
virtual void print(){cout << "Sub print" << endl;}
virtual ~Sub()
{
cout <<"Sub虚构了0"<< endl;
}
private:
};
class JSon:public Sub
{
public:
//char *info;
static int sung;
JSon()
{
//info="我不知道该说什么";
sung++;
cout << "JSon class" << endl;
print();
cout << "JSon class 创建完毕"<< endl;
}
void prints(){cout << "JSon print" << endl;}
void cmpfl(float a,float b){cout<<(a>b?2:0)<<'\n';}
virtual ~JSon()
{
cout<<"JSon虚构了"<<endl;
//delete info;
}
private:
};
int JSon::sung=0;
int main(int argc, char* argv[])
{
Sub c;
cout<<"---------------\n";
Base *b=&c;
cout<<"---------------\n";
Base *Bk=new Sub();
cout<<"---------------\n";
Sub *Bn=new JSon();
cout<<"---------------\n";
JSon *sn=new JSon();
cout<<"---------------\n";
Sub *sj=(Sub *)sn;
cout<<"---------------\n";
cout<<"基类指向子类对象虚拟函数调用---------------\n";
b->print();
cout<<"基类用子类声明虚拟函数调用---------------\n";
Bk->print();
cout<<"子类用孙类声明虚拟函数调用---------------\n";
Bn->print();
Bn->cmpfl(1.31256,1.67346);
cout<<"孙类对象函数调用json\n";
sn->print();
sn->cmpfl(1.31252,1.65349);
//cout <<sn->info<< endl;
cout<<"----------------------------------------\n";
cout<<"基类用孙类虚拟函数调用,子类未修改也未显式声明\n";
b->cmpfl(1.91252,1.67386);
cout<<"子类用孙类虚拟函数调用,子类未修改也未显式声明\n";
c.cmpfl(1.51252,1.62346);
cout<<"显式删除子类对象指针---------------\n";
delete sj;
cout<<"---------------\n";
cout<<"本程序中JSon被创建的次数是:"<<JSon::sung<<endl;
cout<<"函数行将结束,虚拟析构函数调用情况\n";
//delete sn;
//delete Bk;
//delete b;
return 0;
}
运行结果如下:
Base class
Base print
Base class 创建完毕
Sub class
Sub print
Sub class 创建完毕
---------------
---------------
Base class
Base print
Base class 创建完毕
Sub class
Sub print
Sub class 创建完毕
---------------
Base class
Base print
Base class 创建完毕
Sub class
Sub print
Sub class 创建完毕
JSon class
Sub print
JSon class 创建完毕
---------------
Base class
Base print
Base class 创建完毕
Sub class
Sub print
Sub class 创建完毕
JSon class
Sub print
JSon class 创建完毕
---------------
---------------
基类指向子类对象虚拟函数调用---------------
Sub print
基类用子类声明虚拟函数调用---------------
Sub print
子类用孙类声明虚拟函数调用---------------
Sub print
0
孙类对象函数调用json
Sub print
0
----------------------------------------
基类用孙类虚拟函数调用,子类未修改也未显式声明
2
子类用孙类虚拟函数调用,子类未修改也未显式声明
0
显式删除子类对象指针---------------
JSon虚构了
Sub虚构了0
Base虚构了
---------------
本程序中JSon被创建的次数是:2
函数行将结束,虚拟析构函数调用情况
Sub虚构了0
Base虚构了
Press any key to continue
这里还有两点疑惑:
1、在程序自动清除对象之时,不是所有对象的析构函数都被调用了,这是为什么?
2、在我显式清除所有声明的对象指针之时,发生了‘内存不能读取’错我,难道是空指针吗?