关于c++的多态
来源:互联网 发布:oa java大型源码 编辑:程序博客网 时间:2024/06/06 18:45
c++多态分为两种:
1.静态多态(静态绑定): 绑定发生在编译期.
如函数重载--------两个函数名称一样,参数类型或个数不完全相同,函数的返回类型可以不一样.
2.动态多态(动态绑定): 绑定发生在运行期.
动多态则是通过继承、虚函数(virtual)、指针(应用)来实现.
例子1.
#include <stdio.h>#include <stdlib.h>#include <string.h>class A{public:virtual A* Create();};A* A::Create(){printf("Parent Called\n");return NULL;}class B: public A{public:virtual B* Create();};B* B::Create(){printf("Child Called\n");return NULL;}int main(){B b;A& a = b;a.Create();//输出 Child Called ------多态调用函数时和父子类中函数的返回类型没有多少关系.和函数名和参数(个数、类型)相关.return 0;}
例子2.
#include <stdio.h>struct Point{int x;int y;void DebugPrint(){printf("[x, y] = [%d, %d]\n", x, y);}};class A{public:virtual Point* GetPoint();virtual void Init();};void A::Init(){Point* point = GetPoint();point->DebugPrint();}Point* A::GetPoint(){printf("Parent A.\n");return NULL;}class B: public A{public:B(int x, int y);~B();Point* GetPoint();protected:Point point;};Point* B::GetPoint(){printf("Child B.\n");return &point;}B::B(int x, int y){point.x = x;point.y = y;}B::~B(){}int main(){B b(10, 9);A& a = b;a.Init();//里面调用的是B::GetPoint(),这也是一种多态的使用.return 0;}
说明:
1.含有虚函数的类的对象的数据区的开始位置存放的是一个指向虚表的指针,当出现一个父类指针(或引用)指向子类对象,然后通过父类指针或是引用调用子类函数时回去查虚表中有没有被调用函数,如果有则调用(子类中的),没有则会调用父类的。
2.父类中的虚函数必须要实现,不能只有声明。
- 关于多态,关于 C
- [C++]关于多态的一道题目
- 关于C语言中继承和多态的实现
- 关于C语言中继承和多态的实现
- 关于C语言中继承和多态的实现
- 【C++】关于继承、多态的重点部分复习
- C语言关于多进程的总结
- 关于C的变量
- 关于C的讨论
- 关于C的思考
- 关于C的思考
- 关于C的指针
- 关于C的学习
- 关于C的思考
- 关于C的学习
- 关于c的随机数
- 关于C的缓冲区
- 关于C的思考
- Siebel开发中碰到的小问题与解决方案汇总
- Unique约束
- windows建立svn系统服务
- 汇编指令
- ArrayList和Vector的比较
- 关于c++的多态
- IOS 计算星座
- redis入门实例
- c#面试笔试题 (全部)
- MP4文件格式解析(转载)
- strlen函数与sizeof的区别
- CATransiton
- centos系统删除用yum安装的软件
- 安装nrpe插件遇到的问题(nagios)