C++多态的个人理解
来源:互联网 发布:数据机房项目经理 编辑:程序博客网 时间:2024/06/08 17:16
别的不说,直接上代码。
class Animal{public: Animal(int height,int weight); void breathe();};
class Fish : public Animal{public: Fish();
void breathe();}
void fn(Animal *pAn){ pAn->breathe();}void main(){ Fish fh; Animal *pAn; pAn=&fh; fn(pAn);
}
这里主函数中,pAn=&fh将Fish的指针赋值给Animal指针pAn,这种子类想父类赋值的方式成为向上传递,由于两个的类存模型为下图
由于两者的内存模型匹配,当Fish的指针赋值给Animal指针时,fn转化为了pAn,所以在函数fn(pAn)中,pAn->breathe()运行了Animal::breathe()。
但是,再看下面的代码:
class Animal{public: Animal(int height,int weight);virtual void breathe();};
class Fish : public Animal{public: Fish();
void breathe();}
void fn(Animal *pAn){ pAn->breathe();}void main(){ Fish fh; Animal *pAn; pAn=&fh; fn(pAn);
}
一个virtual导致完全不同的结果,这正是C++多态的作用。直接上概念,分析。
n 多态性
当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。
所以,在pAn=&fh;他在上面的第一个代码中在编译阶段就确定pAn为Animal指针,所以在函数fn(pAn)中运行Animal::breathe()。而第二段代码中,由于父类Animal中virtual void breathe()声明为了虚函数,pAn=&fh在运行阶段,将fn赋值给了pAn,而fn本身是
fish类型指针,所以,pAn->breathe()运行了fish::breathe()。
0 0
- C++多态的个人理解
- C/C++ 中 extern 的个人理解
- 个人对c语言的理解
- 个人对c语言指针的理解
- C语言引用&的个人理解
- C语言的链接属性的个人理解
- C语言的存储类型的个人理解
- 多态的应用和个人对其理解
- c语言栈 《个人理解》
- 个人对c++STL及其它编程语言的理解
- 对c语言中printf函数的个人理解
- 关于C语言静态链接的个人理解,欢迎指正
- Objective-C是动态运行时语言的个人理解
- c语言中的switch语句的个人理解
- 关于c语言不同类型变量存放位置的个人理解
- redis 多租户概念的个人理解
- FormLayout的个人理解
- 数据仓库的个人理解
- 这个信息化的时代我们该如何保证自己的数据安全呢
- ObjectARX2010的安装,配置,64位arx
- 静态断言
- C#程序抓取网页实例
- MFC消息三部曲(1)——自定义消息的使用
- C++多态的个人理解
- 分布式搜索elasticsearch高级配置之(二)------线程池设置
- 《学习bash》笔记--基础shell编程
- hadoop tez hive
- 【Android】 Android开发优化之——对Bitmap的内存优化
- Java中的String类
- java IO 流
- linux环境下的时间函数
- 解析oracle的rownum