5.C++类和对象 多态
静态多态和动态多态
- 静态多态:编译阶段确定函数地址(地址早绑定)
- 函数重载
- 运算符重载
- 动态多态 :运行阶段确定函数地址(地址晚绑定)
- 满足条件
- 继承关系
- 子类要重写父类的虚函数
- 使用:
- 父类的指针或者引用执行子类的对象
- 满足条件
class Animal{
public:
//变成虚函数
virtual void speak(){
cout<<"动物在说话"<<endl;
}
};
class Cat:public Animal{
public:
void speak(){ //可以加virtual也可以不加 一般不加 也是重载父类虚函数
cout<<"小猫在说话"<<endl;
}
};
class Dog:public Animal{
public:
void speak(){
cout<<"小狗在说话"<<endl;
}
};
void dospeak(Animal &animal){ //Animal &animal = cat; c++中允许父子之间的类型转换 //动态多态的使用 父类的指针或者引用 执行子类的对象
animal.speak();
}
int main(){
Cat cat;
Dog dog;
dospeak(cat);
dospeak(dog);
}
纯虚函数
通常父类中虚函数的实现是毫无意义的,如果某个虚函数注定要等待重写,可以将其改为纯虚函数,有纯虚函数的类称为抽象类。
纯虚函数语法:virtual 返回值类型 函数名(参数列表) = 0
抽象类特点:
- 无法实例化对象
- 子类必须重写纯虚函数,不然仍为抽象类
虚析构和纯虚析构
多态使用时候,子类有属性开辟到堆区,那么父类指针释放的时候无法调用到子类析构代码
解决方式:改为虚析构或者纯虚析构。