4类和对象
C++面向对象的三大特征:封装、继承、多态
C++认为万事万物皆为对象,对象上有其属性和行为
4.7 多态
4.7.1 多态的基本概念
多态是C++面向对象三大特性之一
多态分为两类
1、静态多态: 函数重载 和 运算符重载 术语静态多态,复用函数名
2、动态多态:派生类 和 虚函数 实现运行时多态
静态多态 和 动态多态 区别:
1、静态多态 的函数地址早绑定 - 编译阶段确定函数地址
2、动态多态 的函数地址晚绑定 - 运行阶段确定函数地址
#include<iostream> //io流
using namespace std; //设定名称空间,标准standard
#include<iostream> //io流
using namespace std; //设定名称空间,标准standard
// 动态多态
// 动物类
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;
}
};
//执行说话函数
//地址早绑定 在编译阶段,就确定了函数地址
//如果想执行让猫说话,那么这个函数的地址就应该在运行阶段才绑定
//Animal & animal = cat;父类的指针或引用 指向 子类对象
void doSpeak(Animal& animal)
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
Dog dog;
doSpeak(dog);
}
int main()
{
test01();
system("pause");
return 0;
}
注意
(1)动态多态的满足条件:
1、有继承关系
2、子类 需要重写 父类 的虚函数(注意 重载 和 重写 区别)
重写:函数返回值类型、函数名、参数列表,完全相同。重载其中一个不同
(2)动态多态 的使用:
1、父类的指针或引用 指向 子类对象
理论依据剖析
vfptr(virtual function pointer虚函数指针),指向虚函数表(vftable)
4.7.2 多态案例---计算器类
多态的优点:
1、代码组织结构清晰