多态是C++面向对象的三大特性之一。
多态分为两类:
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
** 静态多态和动态多态的区别:**
- 静态多态的函数地址早绑定–编译阶段确定了函数地址
- 动态多太的函数地址晚绑定–运行阶段确定函数地址
(晚绑定就是根据 ** 对象的不同 **去确定运行哪个函数)
动态多态满足条件:
- 有继承关系
- 子类要重写父类的虚函数(父类函数中添加virtual关键字)
动态多态的使用:
** 父类指针或者引用 指向子类对象,调用子类方法实现。**
Father & father = son;
重写与重载区别:
重写:函数返回值类型 函数名 参数列表 均完全相同
重载:函数名相同,参数不同(类型、顺序、数量等),与返回类型无关
Class Animal{
pubilc:
void speak(){ //不加 virtual
cout << "speak " << endl;
}
}
此时Animal类是一个空类,sizeof(Animal) = 1。
但如果在speak() 前面加一个 virtual,sizeof(Animal) = 4,此时该类有一个指针vfptr( virtual function pointer )。
多态原理: