多态分为两类
(1)静态多态:函数重载和运算符重载属于静态多态,复用函数名
(2)动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态的区别
(1)静态多态的函数地址早绑定—编译阶段确定函数地址
(2)动态多态的函数地址晚绑定—运行阶段确定函数地址
动态多态满足条件
(1)有继承关系
(2)子类重写父类的虚函数
动态多态使用
父类的指针或者引用指向子类对象
多态
在代码运行时,根据传入的类型,决定使用哪种类称为多态
代码示例(不使用虚函数)
#include <iostream>
using namespace std;
class Animal
{
public:
void speak()
{
cout <<"动物在说话" <<endl;
}
};
class Cat:public Animal
{
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
void test_doSpeak(Animal &A)
{
A.speak();
}
int main()
{
Cat c;
test_doSpeak(c);
return 0;
}
输出结果
上面用基类的引用去引用派生类是被允许的,称为向上强制转换,这使得公有继承不需要进行显示类型转换,该规则是is-a的一部分。
代码示例(虚函数)
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void speak() //虚函数,地址晚绑定
{
cout <<"动物在说话" <<endl;
}
};
class Cat:public Animal
{
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
void test_doSpeak(Animal &A)
{
A.speak();
}
int main()
{
Cat c;
test_doSpeak(c);
return 0;
}
输出结果