虚函数的简介与示例
来源:互联网 发布:龙之谷手游数据互通吗 编辑:程序博客网 时间:2024/05/29 14:45
虚函数:
一旦基类Person中有虚函数virtual func,其子类Chiid中如果有重写override该函数func的,无论其是否申明为virtual,派生类对其重定义申明的函数均为virtual。
对于含有虚函数的类来说:
1、虚函数表是与类关联的,也就是说,一个类只有一张虚函数表。(从这个方面上说,虚函数类似于类的静态函数)
2、VTable中虚函数的位置是由基类决定的,所以,哪怕你在派生类中不是按基类的顺序来重写虚函数,派生类的VTable中虚函数的存放顺序和基类的也是一样的。
3、虚函数指针vfPtr是与对象关联的,每个对象都有一个隐藏的虚函数指针,该指针指向该类的虚函数表。但是,同类对象的虚函数指针的值是相同的。因为都指向该类的虚函数表。
4、虚函数指针vfPtr的值是在调用构造函数时进行初始化的。如果该类没有构造函数,那么,默认构造函数干的唯一一件事就是初始化VPtr。所以,当你在写一个类的构造函数时,一定不要写一个空的默认构造函数。
纯虚函数:
只有声明没有实现,格式如virtual func()=0;含有纯虚函数的类叫抽象类,不能够实例化,派生类必须实现基类的纯虚函数。
虚函数的几点限制:
1. 只有类的成员函数可为虚函数;
2. 静态成员函数不能为虚函数;
3. 构造函数不能为虚函数;
4. 析构函数可以为虚函数。
对于第3点的解释,因为创建派生类对象时,基类的构造函数先于派生类的构造函数执行,所以构造函数不能为虚函数。
-----------------------------------------------------
析构函数一般申明为虚函数的原因?
见下文具体实例:
输出结果为:
Base::Base()
Derive::Derive()
Derive::~Derive()
Base::~Base()
如果将Base的析构函数的声明virtual去掉,结果为:
Base::Base()
Derive::Derive()
Base::~Base()
如果在Derive类的构造函数中占用了系统资源(如分配了内存),那么你在释放b的时候,如果单纯的只是调用b的析构函数,那么就会造成资源泄漏。
但是如果把析构函数声明为virutal,那么就可以先调用子类的析构函数释放资源,再调用父类的析构函数。
- 虚函数的简介与示例
- epoll简介与示例的整理
- epoll简介与示例的整理
- Android的AsyncTask简介与示例应用
- jsp简介与示例
- UrlRewrite 简介与示例
- Iptables简介与示例
- 函数指针的定义与操作示例
- 变量与函数的综合示例
- 10-变量与函数的综合示例
- Dbus简介与简单的收发示例程序
- OSG拖拽器简介与示例
- Mono.Cecil简介与示例
- tomcat基础简介与示例
- 函数对象functor的简介与用法
- JS的函数简介与使用
- PCRE函数简介和使用示例
- PCRE函数简介和使用示例
- 好玩儿的编程语录
- 打印螺旋矩阵
- Matlab多种图像边缘检测方法
- 认清枚举本质
- 架构设计的一点想法——MVC架构和及其胶合层的思考
- 虚函数的简介与示例
- Struts2——访问web元素!!!
- 有用的东西。。。 哈哈
- linux修改root密码
- English, you make me confused
- 系统架构设计师考试试题分类精解与题型练习
- Java读取文件内容的几种方式集合
- 编译BlueZ
- xml-rpc的实践