在这里写东西,多半是给自己看的。初衷是想记录一下自己的点点滴滴。
1、继承:
说道继承,就必然有子类和父类。子类继承父类的一些成员变量,成员函数。继承的方式可以分为public,protected,private。继承的方式不同,那么得到的和往下传递的内容就会受到不同层次的限制。子类继承父类的函数,那么就会先执行父类函数,再执行子类函数。(前提是子类也实现了父类的同名函数)
2、多态:
多态分类多态和函数多态。
类多态是虚表和动态绑定相结合。函数多态就是函数重载。函数重载是c++面向对象思想特有的,c不具备这种特性。(函数重载的详细介绍请见http://blog.csdn.net/mydad353193052/article/details/46500613)
那么说虚表,就要说虚指针。虚表和虚指针的初始化是在子类的构造函数初始化是定义的。虚指针对应一个对象的虚表的地址。注意,这里是对象,而不是类。因为类可以有很多对象,也可以没有对象。这完全在于你是否实例化类,就是new类,new了就是对象。所以类的作用域更广泛。那么这里又引申一个问题,静态成员变量属于类而不属于对象,原因我想大概亦如此。
虚表就是一个存储虚函数地址的一维数组。一个在父类的函数,如果前面加上了virtual关键字,那么就可能由继承演变成多态了。因为继承会执行父类同名函数而后在执行子类的。多态略有不同,如果父类和子类同时存在同名函数的实现,那么如果调用子类函数,会直接执行子类实现内容。因为子类函数会覆盖父类函数在虚表中的地址。这是因为同名函数在父类和子类的虚表中的地址是相同的。编译器在编译时,需要动态判断,也叫迟绑定,就是根据函数实际的调用者来进行函数调用。
比如说调用子类的虚函数,那么编译器通过虚指针找到调用者的虚表,然后先在父类中找到虚函数,此时再找子类的同名虚函数,若子类存在,则覆盖父类的,否则就执行父类的虚函数。
3、继承和多态有什么区别?
virtual 是虚函数,子类继承父类的虚函数,那么子类调用时,虚表中父类函数地址会被子类覆盖,在子类中不能调父类的虚函数。而继承时,父类的函数可以在子类中调用。继承是在函数编译阶段就确定的。而多态需要动态绑定,是运行阶段才确定的。另外,如果函数不是虚函数,尽量不要在子类中命名和父类中完全一致的函数来继承,因为会带来很多歧义。
多态:目的是实现接口重用。
继承:实现代码重用。
封装:实现代码的模块化。
override表示重写,用于继承类对基类中虚函数的实现
overload表示重载,用于同一个类中同名方法不同参数(类型,个数不同)的实现