1.多态概念:
多态:不同类型对象调用相同接口完成不同的行为。
根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式。
2.早绑定与晚绑定
实现:C++多态性主要是通过虚函数实现的,虚函数允许子类重写override(注意和overload的区别,overload是重载,是允许同名函数的表现,这些函数参数列表/类型不同)。
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。
如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。
而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
覆盖(重写)成立的三个条件
1.继承
2.子类覆盖(重写)父类虚函数
3.父类指针/引用指向子类
3.虚函数定义的规则
虚函数定义规则:
1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,有无const.那么即使加上了virtual关键字,也是不会覆盖。
2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。
3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。
4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。
5.构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。
6.析构函数可以是虚函数,而且通常声明为虚函数。
#include<iostream>
using namespace std;
class Base{
public:
virtual void test(){
cout<< "Base test" <<endl;
}
};
class Derive:public Base{
public:
void test(){
cout << "Derive" << endl;
}
};
int main(){
Base* pbase=new Derive;
pbase->test();
Derive yderive;
Base& ybase= yderive;
ybase.test();
}
4.纯虚函数
class 类名{
virtual 返回值类型 函数(形参列表) = 0;
}
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加=0
抽象类
包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。
5.重载和覆盖的区别
No | 重载 | 覆盖 |
---|---|---|
1 | 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。 | 覆盖要求函数名、参数列表、返回值必须相同。 |
2 | 在类中重载是同一个类中不同成员函数之间的关系。 | 在类中覆盖则是子类和基类之间不同成员函数之间的关系。 |
3 | 重载函数是在编译时确定调用一个函数。 | 重载函数是在执行时确定调用个函数。 |
6.判断是否覆盖