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
- C++对象模型中的虚拟函数分析
- 菱形虚拟继承对象模型分析
- c++对象模型-虚拟析构函数
- C++虚拟继承中的对象模型
- 【C++】虚函数在不同继承方式中的对象模型
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- Microsoft Visual C++虚拟多继承 对象模型初步分析
- C++多重继承和虚拟继承对象模型、效率分析
- Microsoft Visual C++虚拟多继承 对象模型初步分析
- C++多重继承和虚拟继承对象模型、效率分析
- C++多重继承和虚拟继承对象模型、效率分析
- C++ - 多重继承和虚拟继承对象模型、效率分析
- 菱形虚拟继承&虚函数表&对象模型
- 漫谈C++:对象内存模型分析
- 【C++】浅析C++中的对象模型
- 【C++】浅析C++中的对象模型
- 【c++】菱形虚拟虚拟继承模型探索
- 《深度探索C++对象模型》读书笔记2:C++对象模型,我的虚拟函数被放在哪里?
- 【机器学习】支持向量机SVM
- 【POJ2253】Frogger 最短路,你想写LCA我不拦你
- 第十周项目1.1 六次计算
- ubuntu下锁定笔记本的触摸板
- 项目管理学习笔记之五.沟通协调能力II
- C++对象模型中的虚拟函数分析
- UML视频总结(全面)
- Java运算符详解及其优先级
- FZU 1775 Counting Binary Trees(卡特兰数前n项和模m)
- tomcat部署web应用过程
- 关于寄存器ESP和EBP的一些理解
- 2-sat(石头、剪刀、布)hdu4115
- Spring MVC那些事之ApplicationContext使用
- ARC与垃圾回收机制的区别