" 多态 " 实现需要满足以下三个条件 :
满足 ① 继承 , ② 虚函数重写 , ③ 父类指针/引用指向子类对象 三个条件 , 即可实现多态 ;
在 C 语言中 , 指针存在的 最大意义 就是 " 间接赋值 " ;
" 间接赋值 " 成立的三大条件 :
借助 " 多态 " , 我们可以事先 开发出 一套 软件框架 , 实现一些功能 ;
在 软件框架 中 的 函数 中 , 传入 父类指针 作为 参数 , 之后 通过该 父类指针 调用其 virtual 虚函数 ;
在之后的开发中 , 编写 子类 实现 父类 , 并 重写 父类的 virtual 虚函数 ;
然后 调用 软件框架 中的 函数 , 传入 新编写 的 子类对象指针 , 此时 调用的 不再是 父类的 函数 , 而是 子类重写的 函数 ;
这就实现了 复用 后面写的代码 ;
" 封装 " 突破了 C 语言 的 函数概念 , C 语言中的 函数 仅能 封装 逻辑操作 , " 封装 " 能将 数据 和 操作 同时封装到一起 , 组成类 ;
将 封装好的 类对象 传入函数中 , 可以在函数中调用 类对象的 成员变量 和 成员方法 ;
" 继承 " 可以实现 代码的 复用 , 这里的 复用 是 复用 之前写的代码 ;
" 多态 " 实现的也是 代码 的复用 , 这里的 复用 是 复用 之后写的代码 ;
" 多态 " 多用于 软件框架 , 提前实现 功能框架 , 功能细节 , 使用多态在后续开发时实现 ;
先开发出 导弹发射 的框架出来 , 此时还没有研究出导弹 , missileFire 函数用于发射导弹 ;
void missileFire(Missile* missile)
{
// 发射导弹
missile->fire();
}
后期 , 研究出了 DF1 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_1 类的对象地址 , 调用的事 DF_1 类对象的发射方法 ;
DF_1 df1;
missileFire(&df1);
研究出了 DF2 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_2 类的对象地址 , 调用的事 DF_2 类对象的发射方法 ;
DF_2 df2;
missileFire(&df2);
研究出了 DF3 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_3 类的对象地址 , 调用的事 DF_3 类对象的发射方法 ;
DF_3 df3;
missileFire(&df3);
注意 : 要 多态 的函数 , 必须使用 virtual 关键字 , 将其设置为虚函数 ;
代码示例 :
#include "iostream"
using namespace std;
// 父类 - 导弹
class Missile {
public:
virtual void fire()
{
cout << "发射导弹" << endl;
}
public:
int scope;
};
class DF_1 : public Missile
{
public:
virtual void fire()
{
cout << "发射东风1导弹, 射程 " << scope << " 公里" << endl;
}
public:
int scope = 600;
};
class DF_2 : public Missile
{
public:
virtual void fire()
{
cout << "发射东风2导弹, 射程 " << scope << " 公里" << endl;
}
public:
int scope = 1300;
};
class DF_3 : public Missile
{
public:
virtual void fire()
{
cout << "发射东风3导弹, 射程 " << scope << " 公里" << endl;
}
public:
int scope = 2800;
};
void missileFire(Missile* missile)
{
// 发射导弹
missile->fire();
}
int main() {
DF_1 df1;
missileFire(&df1);
DF_2 df2;
missileFire(&df2);
DF_3 df3;
missileFire(&df3);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
发射东风1导弹, 射程 600 公里
发射东风2导弹, 射程 1300 公里
发射东风3导弹, 射程 2800 公里
请按任意键继续. . .