多态是面向对象三大特征之一,前面我们已经学习了封装、继承,接下来我们就学习多态。
多态分为两类:
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
我们也主要学习动态多态,我们要注意动态多态的函数地址晚绑定,运行阶段确定函数地址。
动态多态满足条件
1、有继承关系
2、子类重写父类的虚函数
重写:函数返回值类型 函数名 参数列表 完全一致称为重写
示例1:
#include<iostream>
using namespace std;
//动物类
class Animal
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
//猫类
class Cat :public Animal
{
public:
//重新 函数返回值类型 函数名 参数列表 完全相同
void speak()
{
cout << "小猫在说话" << endl;
}
};
//狗类
class Dog :public Animal
{
public:
void speak()
{
cout << "小狗在说话" << endl;
}
};
//动态多态使用
//父类的指针或者引用 指向子类对象
void doSpeak(Animal&animal)//Animal & animal = cat ;
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
Dog dog;
doSpeak(dog);
}
void test02()
{
cout << "sizeof Animal = " << sizeof(Animal) << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
在多态函数中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)=0;
只要有一个纯虚函数,这个类称为抽象类
抽象类特点:
1、无法示例化对象
2、抽象类的子类 必须要重写父类中的纯虚函数,否则也属于抽象类
示例2:
#include<iostream>
using namespace std;
#include<string>
class Base
{
public:
//纯虚函数
virtual void func() = 0;
};
class Son :public Base
{
public:
virtual void func()
{
cout << "func函数调用" << endl;
}
};
void test01()
{
//Base b;//抽象类是无法实例化对象
//new Base;
//Son s;//子类必须重写父类中纯虚数,否则无法实例化对象
Base*base = new Son;
base->func();
}
int main()
{
test01();
system("pause");
return 0;
}