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

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

可总是感觉有些迷糊,于是敲了一段代码出来试验,一探究竟(编程环境是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、在我显式清除所有声明的对象指针之时,发生了‘内存不能读取’错我,难道是空指针吗?



猜你喜欢

转载自blog.csdn.net/u014694028/article/details/40714759