我的虚函数个人总结
2016-06-30 12:32
337 查看
通过将基类中的成员函数声明为虚函数,那么子类中的同原型函数构成成为基类中的虚函数的覆盖版本,此时,通过指向子类的对象的基类指针(或者引用)调用该虚函数,实际被调用函数版本的由指针(或者引用)所指向的对象决定,而于指针(引用)本身的类型无关,此语法现象叫做多态
动态类型绑定和虚函数表
A * pa=new B
当编译器看到如下的函数调用时,
pa->bar()
它不知道pa所指向的对象的确切类型,编译器就会生成一段代码替代以上的函数调用 该代码执行如下的操作
1:确定pa所指向的对象的实际类型
2: 然后通过这个对象的虚函数表 指针,vftb1访问其虚函数表
找到与foo函数相对应的虚函数入口地址
3: 根据入口地址调用该函数
运行结果:
parent contrount
child contrount
child child hello
虚析构函数
1:通过将基类的析构函数定义为虚函数 当delete一个指向子类的基类的指针时,实际上被调用的是子类的析构函数,而子类的析构函数 将会自动调用基类的 析构函数 ,进而保证类对象及其基类的对象都能够得到释放
2:即使析构函数 什么也不作,仅仅为了实现提供一个虚析构函数也需要基类定义该析构函数,因为缺省析构函数不是虚函数
3:如果一个类中包含有虚函数,那么总将其定义一个虚析构函数总没有坏处
纯虚函数,抽象类,纯抽象类 的定义和区分
1:纯虚函数 :virtual 返回类型 成员函数名 (形参表)=0;
2:包含纯虚函数 的类叫做抽象类 抽象类不能实例化对象
3:完全由纯虚函数组成的抽象类,叫做纯抽象类
不可以是虚函数的: 构造函数 静态成员函数
动态类型绑定和虚函数表
A * pa=new B
当编译器看到如下的函数调用时,
pa->bar()
它不知道pa所指向的对象的确切类型,编译器就会生成一段代码替代以上的函数调用 该代码执行如下的操作
1:确定pa所指向的对象的实际类型
2: 然后通过这个对象的虚函数表 指针,vftb1访问其虚函数表
找到与foo函数相对应的虚函数入口地址
3: 根据入口地址调用该函数
class parent{ public: parent(){ cout<<"parent contrount"<<endl; } virtual void hello(){} void parent_hello_1(){ cout<<"hello parent hello_1"<<endl; } }; class child :public parent { public : child(){ cout<<"child contrount"<<endl; } void hello(){ cout<<"child child hello ....."<<endl; } void child_hello_1(){ cout<<"child hello _1"<<endl; } }; int main(int argc, const char *argv[]) { parent * p=new child; p->hello(); return 0; }
运行结果:
parent contrount
child contrount
child child hello
虚析构函数
1:通过将基类的析构函数定义为虚函数 当delete一个指向子类的基类的指针时,实际上被调用的是子类的析构函数,而子类的析构函数 将会自动调用基类的 析构函数 ,进而保证类对象及其基类的对象都能够得到释放
2:即使析构函数 什么也不作,仅仅为了实现提供一个虚析构函数也需要基类定义该析构函数,因为缺省析构函数不是虚函数
3:如果一个类中包含有虚函数,那么总将其定义一个虚析构函数总没有坏处
纯虚函数,抽象类,纯抽象类 的定义和区分
1:纯虚函数 :virtual 返回类型 成员函数名 (形参表)=0;
2:包含纯虚函数 的类叫做抽象类 抽象类不能实例化对象
3:完全由纯虚函数组成的抽象类,叫做纯抽象类
不可以是虚函数的: 构造函数 静态成员函数
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 深入理解C#中new、override、virtual关键字的区别
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析