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