文章目录
前言
本文记录本渣渣依据黑马程序员C++课程视频学习C++笔记
本节记录C++类和对象–多态–多态的基本语法
一、多态基本语法
1、多态分为两类:
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
2、静态多态和动态多态区别:
- 静态多态的函数地址早绑定–编译阶段确定函数地址
- 动态多态的函数地址晚绑定–运行阶段确定函数地址
3、动态多态满足条件:
- 有继承关系。
- 子类重写父类的虚函数
函数重写:函数返回值类型、函数名、参数列表完全相同
4、动态多态使用条件:
- 父类的指针或引用执行子类对象
5、C++中允许基类与派生类之间的类型转换
- 当父类引用或指针接受子类对象时,会发生类型转换
- 此时为静态多态,地址早绑定,在编译阶段确定函数地址
- 无论接受什么子类对象,都将执行父类成员方法
简易代码如下:
#include <iostream>
using namespace std;
//基类Animal实现
class Animal {
public:
void speak() {
cout << "Animal is speaking" << endl;
}
};
//派生类Cat实现,使用public继承
class Cat :public Animal {
public:
void speak() {
cout << "Cat is speaking" << endl;
}
};
//派生类Dog实现,使用public继承
class Dog : public Animal {
void speak() {
cout << "Dog is speaking" << endl;
}
};
//无多态,地址早绑定
//即使传入cat对象,也是使用animal对象成员函数
void doSpeak(Animal& animal) {//使用基类引用或指针接受派生类对象
animal.speak();
}
void test() {
Cat cat;
doSpeak(cat);//传入cat,发生转换
}
int main() {
test();
system("pause");
return 0;
}
二、动态多态
如果想执行子类成员方法,那么这个函数地址就不能提前绑定,需要在运行阶段绑定,即地址晚绑定,此时需要动态多态
1.使用virtual关键字实现基类虚成员函数
代码如下:
class Animal {
public:
virtual void speak() {
cout << "Animal is speaking" << endl;
}
};
此时执行test()
总结
多态满足条件:
- 有继承关系
- 派生类重写基类中的虚函数
多态使用条件:
- 父类指针或引用指向子类对象
函数重写:
- 在派生类中,成员函数的返回值类型,函数名,参数列表与基类完全一致称为函数重写