多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。

在c++中实现多态,我需要利用基类指针可以在隐式转换下指向派生类这一特性。当我们传入不同的对象(基类或派生类)就可以发生多态

 #include <iostream>

 using namespace std;

 class Parent{
public:
void fun()
{
cout << "我是爸爸" << endl;
}
void test()
{
cout << "parent~~~~我是用来测试的" << endl;
}
}; class Son:public Parent
{
public:
void fun()
{
cout << "我是儿子" << endl;
}
void measurement()
{
cout << "son~~~~我是用来测试的" << endl;
}
}; void Go(Parent *p)
{
p->fun();
}
int main()
{
Parent p;
Son S;
Go(&p);
Go(&S);
system("pause");
return ;
}

上述代码中,void Go(Parent *p)函数就相当于领班发出的命令,Parent,Son就相当于不同的两个工人,而void fun()函数就相当于他们各自负责的工作。

运行结果:

而此时结果并不是我们所想的那样。让我们来分析一下:

p指针是指向基类的指针,所以他只能访问Parent::fun()和Parent::test()。并不能访问Son::fun()。为了解决这个问题我们必须要使用virtual关键字,在基类的将基类的void fun()函数写成虚函数,在派生类中在进行从写。这样我门就能很好的达到多态的目的。

运行结果:

在此我们已经成功的使用了多态,p指针是如何来选择到底是选择那个void fun()函数的呢?

其实在存在虚函数的类中都存在一个指向虚函数表的指针(VPTR)。在发生多态时都是根据VPTR指针的索引来调用不同的函数。

最新文章

  1. 【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件
  2. E. Vasya and Beautiful Arrays
  3. Activity的四种launchMode
  4. 【QT】C++ GUI Qt4 学习笔记3
  5. win系统下nodejs安装及环境配置
  6. OceanBase架构浅析(二)
  7. CAS登录后回传除了ticket参数以外的其他自定义参数
  8. Linux 线程模型的比较:LinuxThreads 和 NPTL
  9. ueditor富文本编辑的使用方法
  10. C#使用seleium实现一个自动登录器
  11. 2388 Who&amp;#39;s in the Middle(简单排序)
  12. UVa1599,Ideal Path
  13. VS2010下安装boost库
  14. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议
  15. 20165337 2017-2018-2《Java程序设计》课程总结
  16. maven 配置篇 之 settings.xml
  17. WebSphere部署应用教程
  18. 笔记:Oracle查询重复数据并删除,只保留一条记录
  19. Myeclipse2017 安装反编译插件和SVN插件
  20. POJ2431--Expedition(优先队列)

热门文章

  1. Vue打包桌面程序
  2. SSH反向代理转发至内网msf
  3. 四、angularjs 如何在页面没有登录的情况下阻止用户通过更改url进入页面--$stateChangeStart
  4. spring boot(7)-mybatis全注解化
  5. Android知识点滴
  6. ls 操作命令 -l/-R和rm -r dir 功能实现
  7. 集合、深浅copy
  8. linux,强大的history命令
  9. ORA-28001:口令已经失效
  10. UNIX crontab自动执行脚本