c++继承和多态的一点小小的理解
2015-05-09 22:37
260 查看
在这里写东西,多半是给自己看的。初衷是想记录一下自己的点点滴滴。
1、继承:
说道继承,就必然有子类和父类。子类继承父类的一些成员变量,成员函数。继承的方式可以分为public,protected,private。继承的方式不同,那么得到的和往下传递的内容就会受到不同层次的限制。子类继承父类的函数,那么就会先执行父类函数,再执行子类函数。(前提是子类也实现了父类的同名函数)
2、多态:
多态分类多态和函数多态。
类多态是虚表和动态绑定相结合。函数多态就是函数重载。函数重载是c++面向对象思想特有的,c不具备这种特性。(函数重载的详细介绍请见/article/1932426.html)
那么说虚表,就要说虚指针。虚表和虚指针的初始化是在子类的构造函数初始化是定义的。虚指针对应一个对象的虚表的地址。注意,这里是对象,而不是类。因为类可以有很多对象,也可以没有对象。这完全在于你是否实例化类,就是new类,new了就是对象。所以类的作用域更广泛。那么这里又引申一个问题,静态成员变量属于类而不属于对象,原因我想大概亦如此。
虚表就是一个存储虚函数地址的一维数组。一个在父类的函数,如果前面加上了virtual关键字,那么就可能由继承演变成多态了。因为继承会执行父类同名函数而后在执行子类的。多态略有不同,如果父类和子类同时存在同名函数的实现,那么如果调用子类函数,会直接执行子类实现内容。因为子类函数会覆盖父类函数在虚表中的地址。这是因为同名函数在父类和子类的虚表中的地址是相同的。编译器在编译时,需要动态判断,也叫迟绑定,就是根据函数实际的调用者来进行函数调用。
比如说调用子类的虚函数,那么编译器通过虚指针找到调用者的虚表,然后先在父类中找到虚函数,此时再找子类的同名虚函数,若子类存在,则覆盖父类的,否则就执行父类的虚函数。
3、继承和多态有什么区别?
virtual 是虚函数,子类继承父类的虚函数,那么子类调用时,虚表中父类函数地址会被子类覆盖,在子类中不能调父类的虚函数。而继承时,父类的函数可以在子类中调用。继承是在函数编译阶段就确定的。而多态需要动态绑定,是运行阶段才确定的。另外,如果函数不是虚函数,尽量不要在子类中命名和父类中完全一致的函数来继承,因为会带来很多歧义。
多态:目的是实现接口重用。
继承:实现代码重用。
封装:实现代码的模块化。
override表示重写,用于继承类对基类中虚函数的实现
overload表示重载,用于同一个类中同名方法不同参数(类型,个数不同)的实现
1、继承:
说道继承,就必然有子类和父类。子类继承父类的一些成员变量,成员函数。继承的方式可以分为public,protected,private。继承的方式不同,那么得到的和往下传递的内容就会受到不同层次的限制。子类继承父类的函数,那么就会先执行父类函数,再执行子类函数。(前提是子类也实现了父类的同名函数)
2、多态:
多态分类多态和函数多态。
类多态是虚表和动态绑定相结合。函数多态就是函数重载。函数重载是c++面向对象思想特有的,c不具备这种特性。(函数重载的详细介绍请见/article/1932426.html)
那么说虚表,就要说虚指针。虚表和虚指针的初始化是在子类的构造函数初始化是定义的。虚指针对应一个对象的虚表的地址。注意,这里是对象,而不是类。因为类可以有很多对象,也可以没有对象。这完全在于你是否实例化类,就是new类,new了就是对象。所以类的作用域更广泛。那么这里又引申一个问题,静态成员变量属于类而不属于对象,原因我想大概亦如此。
虚表就是一个存储虚函数地址的一维数组。一个在父类的函数,如果前面加上了virtual关键字,那么就可能由继承演变成多态了。因为继承会执行父类同名函数而后在执行子类的。多态略有不同,如果父类和子类同时存在同名函数的实现,那么如果调用子类函数,会直接执行子类实现内容。因为子类函数会覆盖父类函数在虚表中的地址。这是因为同名函数在父类和子类的虚表中的地址是相同的。编译器在编译时,需要动态判断,也叫迟绑定,就是根据函数实际的调用者来进行函数调用。
比如说调用子类的虚函数,那么编译器通过虚指针找到调用者的虚表,然后先在父类中找到虚函数,此时再找子类的同名虚函数,若子类存在,则覆盖父类的,否则就执行父类的虚函数。
3、继承和多态有什么区别?
virtual 是虚函数,子类继承父类的虚函数,那么子类调用时,虚表中父类函数地址会被子类覆盖,在子类中不能调父类的虚函数。而继承时,父类的函数可以在子类中调用。继承是在函数编译阶段就确定的。而多态需要动态绑定,是运行阶段才确定的。另外,如果函数不是虚函数,尽量不要在子类中命名和父类中完全一致的函数来继承,因为会带来很多歧义。
多态:目的是实现接口重用。
继承:实现代码重用。
封装:实现代码的模块化。
override表示重写,用于继承类对基类中虚函数的实现
overload表示重载,用于同一个类中同名方法不同参数(类型,个数不同)的实现
相关文章推荐
- 对数据结构一点一小小的理解(三)——C++ 模板库
- 继承和多态的一点小小研究
- C++中关于类(封装、继承、多态)区别于结构体的理解
- 对于C++保护继承方式的一点理解
- 对C++继承,封装,多态的理解
- 简单理解C++的多态公有继承及虚函数
- 从C语言的角度出发理解C++的封装继承和多态
- 对C++多态的一点理解
- deep_c++::多态,虚函数的一点理解
- C++继承的一点理解
- 如何用C语言实现C++的基本特性:封装、继承、多态
- C++构造、析构、继承、多态--一道题
- 理解oo:继承、多态、重写、重载、接口、抽象类
- C++中三个特性(继承、封装、多态、类之间的关系)
- 更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
- Java基础-四大特性理解(抽象、封装、继承、多态)
- C语言实现C++继承和多态
- C++学习------对多态的理解
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- java继承和多态的理解