虚函数
2016-02-21 22:03
204 查看
虚函数的概念
谈到虚函数就离不开“多态”,而面向对象语言的核心竞争力就是“多态”。因为“多态”大大缩短了程序员的开发周期,使得很多前辈的成果可以直接使用。而“多态”的三个必要条件:多态的三个必要条件:
1、要有继承(实现implements)
2、要有重写(overWrite&overRide)
3、父类引用指向子类对像
class CMan { public: virtual void Eat(){……}; void Move(); private: ... }; class CChild : public CMan //1.继承 { public: virtual void Eat(){……};//2.重写 private: ... }; CMan m_man; CChild m_child; CMan *p ; p = &m_man ; p->Eat(); //始终调用CMan的Eat成员函数,不会调用 CChild 的 p = &m_child;//3.父类引用指向子类对象 p->Eat(); //如果子类实现(覆盖)了该方法,则始终调用CChild的Eat函数,不会调用CMan 的 Eat 方法;如果子类没有实现该函数,则调用CMan的Eat函数 p->Move(); //子类中没有该成员函数,所以调用的是基类中的
同时在这里需要补充的就是“多态”被称为迟后编译或者滞后编译。也就是在运行的时候才能确定载入哪个函数。
重载函数和虚函数的区别
1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同; 2)在定义虚函数的类中,虚函数必须声明为类的成员而不能是友元,可以被声明为其他类的友元;析构函数可以是虚函数,构造函数不行。
虚函数的需要注意的地方
1.如果虚函数在基类和子类中出现的仅仅是名字的相同,而参数类型不同,或者返回类型不同,即使写上virtual关键字,也不进行迟后编译2.但是有一种例外,如果基类中的虚函数返回一个基类指针或者返回一个基类引用,子类中的虚函数返回一个子类指针或者子类引用,则c++将其视为同名虚函数,进行迟后编译。
3.只有类的成员函数才能说明为虚函数,普通函数不能说明为虚函数。
4.静态成员不能是虚函数,因为静态成员函数不受限与某个对象。
5.内联函数也不能构成虚函数,因为内联函数不能在运行中动态确定其位置。
6.构造函数也不能是虚函数,因为构造时,对象还是一片未定型的空间,虚函数的意义发生与父类引用指向子类对像。
7.析构函数可以构造虚函数。
PS(内联函数:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。 一个小内存空间的函数非常受益。)
纯虚函数的作用
纯虚函数是指在基类中声明但是没有定义的虚函数:virtual type func(param list) = 0; 把虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数,否则编译器会报错。如果一个类至少有一个纯虚函数,则称为抽象类。抽象类只能用来作为其他类的基类,不能定义抽象类的对象,因为在抽象类中有一个或者多个函数没有定义。但是能够使用抽象类来声明指针或者引用。
相关文章推荐
- CAS(Compare and Swap)理解
- 结合使用saiku、mondrian workbentch建立多维查询报表
- 结构体的数据对齐
- LA_3026_HDU_1358_Period
- 深入理解java异常处理机制
- 数据结构(七)
- SSH面试题
- HDU 5628 Clarke and math Dirichlet卷积+快速幂
- where set trim sql if foreach 实现xml方式的动态sql
- MySQL安装(Windows)
- 数据结构(六)
- 协议
- Diksam代码阅读(4)——创建编译器
- Maven实现直接部署Web项目到Tomcat7
- 不懂前端的程序员不是好美工——UI框架metronic使用教程——程序员视角
- Spring.NET框架环境搭建
- C++中关于指针的理解(一点一点完善中)
- sql之内连接、 左连接、右连接、全连接
- 蓝桥杯 第39阶台阶(dfs)
- 16. 3Sum Closest