C++对象模型中的虚拟函数分析

来源:互联网 发布:php官方手册 编辑:程序博客网 时间:2024/05/17 07:52

对于虚拟函数,知道它的含义,也能够描述出来。参照百度百科,也就是“它提供了‘动态绑定机制”。

可总是感觉有些迷糊,于是敲了一段代码出来试验,一探究竟(编程环境是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 classBase printBase class 创建完毕Sub classSub printSub class 创建完毕------------------------------Base classBase printBase class 创建完毕Sub classSub printSub class 创建完毕---------------Base classBase printBase class 创建完毕Sub classSub printSub class 创建完毕JSon classSub printJSon class 创建完毕---------------Base classBase printBase class 创建完毕Sub classSub printSub class 创建完毕JSon classSub printJSon class 创建完毕------------------------------基类指向子类对象虚拟函数调用---------------Sub print基类用子类声明虚拟函数调用---------------Sub print子类用孙类声明虚拟函数调用---------------Sub print0孙类对象函数调用jsonSub print0----------------------------------------基类用孙类虚拟函数调用,子类未修改也未显式声明2子类用孙类虚拟函数调用,子类未修改也未显式声明0显式删除子类对象指针---------------JSon虚构了Sub虚构了0Base虚构了---------------本程序中JSon被创建的次数是:2函数行将结束,虚拟析构函数调用情况Sub虚构了0Base虚构了Press any key to continue

这里还有两点疑惑:

1、在程序自动清除对象之时,不是所有对象的析构函数都被调用了,这是为什么?
2、在我显式清除所有声明的对象指针之时,发生了‘内存不能读取’错我,难道是空指针吗?



0 0
原创粉丝点击