多态基本概念
多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。
多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将"what"和"how"分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。
c++支持编译时多态(静态多睦)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。
静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。
如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。
而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Animal {
public:
virtual void speak() {
cout << "动物在说话" << endl;
}
};
class Dog : public Animal {
public:
// 重写虚函数
void speak() {
cout << "狗在说话" << endl;
}
};
class Cat : public Animal {
public:
void speak(){
cout << "猫在说话" << endl;
}
};
// 如果两个类发生了继承父类和子类编译器会自动转换,不需要人为转换
void do_work(Animal &obj) {
obj.speak(); // 地址早绑定 -> 加上函数前面加上virtual关键字瞭地址晚绑定
}
void test1() {
Animal p1;
do_work(p1);
Dog p2;
do_work(p2);
Cat p3;
do_work(p3);
}
int main() {
test1();
return 0;
}
发送多态的四个条件:
- 父类中有虚函数
- 必须发送继承
- 子类必须重写虚函数(函数的返回值函数名参数一致函数内容可以不一致)
- 父类的指针或引用指向子类的对象