C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数

1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。

2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。

3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。

4:多态用虚函数来实现,结合动态绑定.

5:纯虚函数是虚函数再加上 = 0;

6:抽象类是指包括至少一个纯虚函数的类。

纯虚函数:virtual void fun()=0;即抽象类!必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。

多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
        那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

  最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

 #include<iostream>

 class A{
public:
void foo(){std::cout<<"foo of A"<<std::endl;}
virtual void print(){std::cout<<"Print A"<<std::endl;}
}; class B:public A{
public:
void foo(){std::cout<<"foo of B"<<std::endl;}
void print(){std::cout<<"Print B"<<std::endl;}
}; int main(){
A a;
B b;
A *p=&a;
p->foo();
p->print();
p=&b;
p->foo();
p->print(); }

输出:

foo of A
Print A
foo of A
Print B

最新文章

  1. jQuery实践——属性和css篇
  2. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
  3. Redis总结(三)Redis 的主从复制
  4. HTML 的 &lt;div&gt; 和 &lt;span&gt; 标签
  5. oracle的基本概念
  6. Nginx与Tomcat安装、配置与优化
  7. 丢手帕问题as3版
  8. 为什么还坚持.NET? 找一门适合自己的语言去做编程
  9. GitHub 系列之「怎样使用 GitHub?」
  10. [翻译] ASP.NET Core 2.2 正式版发布
  11. Spring Boot Actuator [监控与管理]
  12. RN-进阶
  13. jquery知识巩固
  14. includes() 方法
  15. python基础之Day7part2 史上最清晰字符编码理解
  16. JavaScript之八皇后问题(递归)
  17. fping常用参数介绍
  18. vim:去掉响铃
  19. Python中raw_input() &amp; input() 的功能对比
  20. arcengine帮助http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/what_s_new_for_developers_at_10_/0001000002zp000000/

热门文章

  1. iis / asp.net 使用 .config 和 .xml 文件的区别
  2. docker生态系统
  3. Window7下安装Jmeter
  4. BBS的登陆——发帖——回帖
  5. HTML中的上下标标签的演示
  6. Orm之中介模型
  7. window7下配置python2.7+tornado3.3开发环境
  8. AQS源码阅读笔记(一)
  9. 极速下载百度网盘-吴水成老师的-dubbo课程
  10. angularjs中的run()方法使用