多态和虚函数的使用
来源:互联网 发布:澳门有mac专柜吗 编辑:程序博客网 时间:2024/06/05 13:28
上一篇博文我提到virtual用法,同时谈到它在多态的实现中有至关重要的位置。现在我们来学习多态到底是什么及其是如何实现的。
在C++中有两种多态性:
1>编译时的多态:通过函数的重载和运算符的重载来实现。
2>运行时的多态:无法根据函数名和参数来确定该调用哪个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。
在类继承中我们的父类对象,指针或引用只能访问父类的成员函数(http://blog.csdn.net/f15829107089/article/details/77104019)在这篇文章里我有讲解,那么咋样才能访问到子类的函数并且使得程序具有通用性呢。下面我们看个例子:
这样我吗可以清楚的看到加virtual之后父类指针访问的是子类的函数,所以实现多态有三个要求:
1>继承体系 2>必须有virtual关键字 3>函数必须达到三同(返回值,函数名,参数列表)
参数列表必须是,参数个数和类型必须相同,不然不能达到多态。
看到了么在这里我们函数没有和父类无参show函数达到三同就没有访问子类的show(int)。
当某一个类的一个类成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数特征。
在其他程序都不变,加入新类S并且继承D类,我们用D类指针访问show方法时虽然父类D方法没有申明为virtual但是我们依然访问的是子类S的show()函数。说明我们的虚函数在继承体系中始终保持虚特性。
- 派生类中定义虚函数必须与基类中的虚函数同名外,还必须同参数表,同返回类型。否则被认为是重载,而不是虚函数。如基类中返回基类指针,派生类中返回派生类指针是允许的,这是一个例外。(这个例外vc6.0不支持,vs支持)
- 只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象。
- 静态成员函数,是所有同一类对象共有,不受限于某个对象,不能作为虚函数。
- 一个类对象的静态和动态类型是相同的,实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。
- 内联函数每个对象一个拷贝,无映射关系,不能作为虚函数。
- 析构函数可定义为虚函数,构造函数不能定义虚函数,因为在调用构造函数时对象还没有完成实例化。在基类中及其派生类中都动态分配的内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。
- 函数执行速度要稍慢一些。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。
- 如果定义放在类外,virtual只能加在函数声明前面,不能(再)加在函数定义前面。正确的定义必须不包括virtual。
有错误之处还请指教。
阅读全文
0 0
- 多态和虚函数的使用
- 多态和虚函数的使用
- C++基础:多态和虚函数的使用
- C++多态及虚函数的理解和使用
- c++中类的多态和虚函数的使用
- C++中类的多态和虚函数的使用
- 多态与虚函数的使用
- PostMessage函数和SendMessage函数的使用
- qsort函数和bsearch函数的使用
- BitBlt函数和StretchBlt函数的使用
- qsort函数和bsearch函数的使用
- qsort函数和bsearch函数的使用
- 函数指针和函数引用的使用
- nvl函数和decode函数的使用
- 函数和标签的使用
- lua函数.和:的使用
- C++的虚函数和多态
- 函数重载和虚函数在概念和使用方式方面的区别
- spring提供默认过滤器进行post编码
- vue学习笔记-----vue+webpack初始化项目(vue1.0的安装)
- 将pycharm中项目上传到GitHub
- 70. Climbing Stairs
- linux-selinux与系统排错
- 多态和虚函数的使用
- Linux系统mariadb管理
- js实现的大根堆算法(基于链式的m叉树)
- C/C++开发者必不可少的15款编译器+IDE
- 全局配置两个git账号
- python爬虫(一)爬取糗事百科
- Unity3D Shader(11)——fragment shader(边缘泛光)
- node中的异步操作
- 第六章 数据结构相关知识点总结