C++学习笔记(十)(多态,文件操作)

这篇博客详细介绍了C++中的多态性,包括静态多态和动态多态,以及如何通过虚函数和纯虚函数实现多态。此外,还讲解了文件操作,包括文本文件和二进制文件的读写,强调了虚析构函数在多态中的作用。内容覆盖了从计算器类案例到电脑组装的多态应用,以及文件操作的基本步骤和注意事项。
摘要由CSDN通过智能技术生成

本笔记主要来源于教程https://www.bilibili.com/video/av41559729?p=1

4.7 多态

多态是C++面向对象三大特性之一
多态分为两类:

  • 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
  • 动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态多态的函数地址早绑定–编译阶段确认函数地址
  • 动态多态的函数地址晚绑定–运行阶段确认函数地址

下面通过案例进行讲解多态

//多态
//动物类
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;
    }

};
//执行说话的函数
//地址早绑定 在编译阶段就确定了函数地址
//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定

//动态多态满足条件
//1、有继承关系
//2、子类重写父类的虚函数

//动态多态使用
//父类的指针或引用 指向子类对象
void doSpeak(Animal &animal)//Animal &animal =cat;
{
    animal.speak();
}
void test01()
{
    Cat cat;
    doSpeak(cat);

    Dog dog;
    doSpeak(dog);
}
int main()
{
    test01();

    system("pause");
    return 0;

}

总结:
多态满足条件:

  • 有继承关系
  • 子类重写父类中的虚函数
    多态使用条件:
  • 父类指针或引用指向子类对象
    重写:函数 返回值类型 函数名 参数列表 完全一致称为重写

多态的原理剖析
在这里插入图片描述

4.7.2 多态案例——计算器类

案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类

多态的优点:

  • 代码组织结构清晰
  • 可读性强
  • 利于前期和后期的扩展以及维护

//分别利用普通写法和多态技术实现计算器 //普通写法 class Calculator { public: int getResult(string oper) { if (oper == "+") { return m_Num1 + m_Num2; } else if (oper == "-") { return m_Num1 - m_Num2; } else if (oper == "*") { return m_Num1 * m_Num2; } //如果想扩展新的功能,需要修改源码 //在真实开发中 提倡 开闭原则 //开闭原则:对拓展进行开放,对修改进行关闭 } int m_Num1;//操作数1 int m_Num2;//操作数2 }; void test01() { //创建计算器对象 Calculator c; c.m_Num1 = 10; c.m_Num2 = 10; cout << c.m_Num1 << "+" << c.m_Num2 << "=" << c.getResult("+") << endl; cout << c.m_Num1 << "-" << c.m_Num2 << "=" << c.getResult("-") << endl; cout << c.m_Num1 << "*" << c.m_Num2 << "=" << c.getResult("*") << endl; } //利用多态实现计算器 //多态好处 //1、组织结构清晰 //2、可读性强 //3、对于前期和后期拓展以及维护性高 //实现计算器抽象类 class AbstractCalculator { public: virtual int getResult() { return 0; } int m_Num1; int m_Num2; }; //加法计算器类 class AddCalculate:public AbstractCalculator { public: virtual int getResult() { return m_Num1+m_Num2; } }; //减法计算器类 class SubCalculate :public AbstractCalculator { public: virtual int getResult() { return m_Num1 -m_Num2; } }; //乘法计算器类 class MulCalculate :public AbstractCalculator { public: virtual int getResult() { return m_Num1 * m_Num2; } }; void test02() { //多态使用条件 //父类指针或者引用指向子类对象 //加法运算 AbstractCalculator *abc
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值