#include <iostream>
#include <string>
using namespace std;
// 动态多态产生条件:
// 1.要有继承关系
// 2.父类中有虚函数、子类要重写父类的虚函数
// 3.父类的指针或引用指向子类的对象
class Animal{
public:
virtual void speak(){ // 虚函数 父类中的virtual不可以省略 加上virtual才能 实现 晚绑定,否则默认早绑定
cout << "动物在叫" << endl;
}
};
class Cat : public Animal{
public:
void speak(){ // 子类中的virtual可以省略不写
cout << "猫在叫: 喵喵" << endl;
}
};
class Dog : public Animal{
public:
virtual void speak(){// 子类中的virtual可以省略
cout << "狗在叫: 汪汪" << endl;
}
};
// 父类的引用指向子类的对象
void speaking(Animal &animal){ // Animal &animal = cat1 不加virtual默认早绑定:静态联编
// 地址早就绑定好了,属于静态联编 :永远执行父类中的代码
// 如果想让小猫咪叫,就需要后绑定。需要在运行阶段再去绑定函数的地址,叫动态联编,父类中添加虚函数
animal.speak();
}
int main()
{
// 1.父类的引用
Cat cat1;
speaking(cat1);
Dog dog1;
speaking(dog1);
// 2.父类的指针指向子类的对象
// Animal* animal = new Cat;
// animal->speak();
Animal* animal = new Dog;
animal->speak();
return 0;
}
多态基本概念
多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。
多态性(polymorphism)改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性
c++支持编译时多态(静态多态:函数重载、运算符重载)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。
静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。