什么是多态?
基类**方法用virtual关键词修饰(虚函数)**,基类对象和子类对象对该方法使用相同的调用方式会分别调用各自类里面实现的函数
。
多态的底层机制:动态联编和静态联编。
静态联编:非虚函数,在编译时就确定好了调用关系。
动态联编:在运行时才去确定调用关系。包含虚函数的类,其对象中存在一个指针,该指针指向一个虚函数表,调用虚函数时会通过指针找到虚函数表去调用对应的虚函数。
多态的限制
☆
函数调用通过指针传递
和引用传递
时多态才会生效,值传递时不会有多态(此时才用的是静态联编,使用的是基类的方法)。- 只有类的成员函数才能声明为虚函数;
- 静态成员函数不能是虚函数;
- 内联函数不能是虚函数;
- 构造函数不能是虚函数;
☆
析构函数一般都声明为虚函数,否则(delete)销毁对象时不会调用子类析构函数而是直接调用基类析构函数;- 重载(函数参数不同)函数不可设为虚函数
也没必要,注意多态的使用场景是使用相同的调用方法即参数都一样。
返回值例外:函数参数相同,但是返回值是当前对象的指针或引用时(函数体 return this),也可以设为虚函数(返回值为其他时编译都会报错)。 - 覆盖:函数参数、返回值相同,可设为虚函数;
源码:https://github.com/calmXia/cpp/tree/Polymorphism
参考:韦东山 C++ 课程