C++程序设计-大模型思维与实践课件 第14章 继承与多态-进阶内容_第1页
C++程序设计-大模型思维与实践课件 第14章 继承与多态-进阶内容_第2页
C++程序设计-大模型思维与实践课件 第14章 继承与多态-进阶内容_第3页
C++程序设计-大模型思维与实践课件 第14章 继承与多态-进阶内容_第4页
C++程序设计-大模型思维与实践课件 第14章 继承与多态-进阶内容_第5页
已阅读5页,还剩26页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十四章继承与多态-进阶内容C++程序设计——大模型思维与实践内容导航实践探究大模型探究大模型实践实践探究3实践探究实践探究

【提问】:背景:学生在学习C++时,需要理解多态的原理和实现。特色:你是一位经验丰富的计算机科学教师,专注于算法和数据结构的教学。技能:你具备深入的算法知识,能够清晰地解释复杂的算法概念。任务:讲解一个典型应用--观察者模式。请以一个最易懂的例子进行讲解,让学生理解多态有什么作用,如何设计多态的程序。流程:1.详细解释算法的工作原理和逻辑流程。2.提供C++代码示例,演示如何实现。3.讨论实现时的注意事项和常见错误。4实践探究实践探究

【回复】:

观察者模式(ObserverPattern)是一种行为设计模式,用于定义对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。它广泛应用于事件驱动的系统,例如GUI程序、订阅-发布系统等。工作原理和逻辑流程1.核心概念:Subject(主题):被观察的对象,维护一个观察者列表,当状态发生变化时通知所有观察者。Observer(观察者):定义统一的更新接口(多态基础)ConcreteObserver(具体观察者):实现具体业务逻辑,接收主题的通知并作出相应的反应。2.逻辑流程:注册观察者:观察者向主题注册,表示对主题的状态感兴趣。通知观察者:当主题的状态发生变化时,通知所有注册的观察者(主题遍历观察者列表调用update())。更新观察者:观察者接收通知后,执行自己的更新逻辑。5实践探究实践探究【回复】:3.多态的作用:通过多态,主题可以以统一的方式管理不同类型的观察者,而不需要关心观察者的具体实现。观察者通过继承一个基类(或实现一个接口),实现自己的更新逻辑。4.C++代码示例:以下是一个简单的观察者模式实现,模拟一个天气预报系统,主题是天气数据,观察者是显示设备。#include<iostream>#include<vector>#include<string>usingnamespacestd;//抽象观察者类classObserver{public:virtualvoidupdate(floattemperature,floathumidity)=0;//纯虚函数virtual~Observer(){}};6实践探究实践探究【回复】://主题类:天气数据classWeatherData{private:vector<Observer*>observers;//观察者列表floattemperature;floathumidity;public:voidregisterObserver(Observer*o){observers.push_back(o);}voidremoveObserver(Observer*o){observers.erase(remove(observers.begin(),observers.end(),o),observers.end());}7实践探究实践探究【回复】:voidnotifyObservers(){for(Observer*o:observers){o->update(temperature,humidity);//通知所有观察者}}voidsetMeasurements(floattemp,floathum){temperature=temp;humidity=hum;notifyObservers();//数据更新时通知观察者}};8实践探究实践探究【回复】://具体观察者类:手机显示classPhoneDisplay:publicObserver{public:voidupdate(floattemp,floathum)override{cout<<"手机显示:温度="<<temp<<"°C,湿度="<<hum<<"%"<<endl;}};//具体观察者类:电视显示classTVDisplay:publicObserver{public:voidupdate(floattemp,floathum)override{cout<<"电视显示:温度="<<temp<<"°C,湿度="<<hum<<"%"<<endl;}};9实践探究实践探究【回复】://具体观察者类:统计显示classStatisticsDisplay:publicObserver{private:floatmaxTemp=-100.0f;floatminTemp=100.0f;floattempSum=0.0f;intnumReadings=0;public:voidupdate(floattemp,floathum)override{tempSum+=temp;numReadings++;if(temp>maxTemp)maxTemp=temp;if(temp<minTemp)minTemp=temp;display();}10实践探究实践探究【回复】:voiddisplay(){cout<<"统计数据:最高温度="<<maxTemp<<"°C,最低温度="<<minTemp<<"°C,平均温度="<<(tempSum/numReadings)<<"°C"<<endl;}};intmain(){WeatherDataweatherData;PhoneDisplayphone;TVDisplaytv;StatisticsDisplaystatisticsDisplay;

weatherData.registerObserver(&phone);weatherData.registerObserver(&tv);weatherData.registerObserver(&statisticsDisplay);

weatherData.setMeasurements(25.0f,65.0f);weatherData.setMeasurements(30.0f,70.0f);weatherData.setMeasurements(20.0f,90.0f);return0;}11实践探究实践探究【回复】:5.代码解析(1)抽象类的作用:Observer是抽象类,定义了观察者的接口。通过多态,主题可以以统一的方式管理不同类型的观察者。(2)主题类的实现:WeatherData维护一个观察者列表,并提供注册、移除和通知观察者的方法。当数据更新时,调用notifyObservers通知所有观察者。(3)观察者类的实现:PhoneDisplay、TVDisplay和StatisticsDisplay是具体观察者,实现了update方法。每个观察者根据接收到的数据执行自己的逻辑。(4)多态的体现:主题通过基类指针调用观察者的update方法,而不需要关心观察者的具体类型。12实践探究实践探究【回复】:6.注意事项和常见错误(1)观察者列表的管理:在移除观察者时,确保不会访问已被删除的指针。使用vector的erase和remove组合可以安全地移除观察者。(2)通知的时机:确保在主题状态更新后立即通知观察者,否则可能导致数据不一致。(3)内存管理:如果使用动态分配的观察者对象,注意在程序结束时释放内存,避免内存泄漏。(4)循环依赖:避免观察者和主题之间的循环依赖,否则可能导致程序崩溃。7.总结观察者模式的核心:通过多态实现主题和观察者之间的解耦,使得主题可以动态地添加或移除观察者。多态的作用:主题可以以统一的方式管理不同类型的观察者,而不需要关心它们的具体实现。应用场景:GUI事件处理、订阅-发布系统、数据监控等。通过这个例子,学生可以清晰地理解多态的作用,以及如何设计一个灵活、可扩展的程序。内容导航实践探究大模型探究大模型实践大模型实践14大模型实践实践案例-银行账户利息计算

需要设计一个银行账户系统,其中包括活期账户和定期账户。在这个系统中,活期利率和定期利率都为年化利率,被设计为银行账户类的静态成员变量,所有银行账户(无论是活期账户还是定期账户)都将共享这些利率值。银行利率需要能被修改和查看。

活期账户按照活期利率和存款月数计算利息,定期账户由定期利率和存款月数计算利息。假设取款时已存的时间长度都为整数月。一个用户可以开立若干活期和定期账户,请计算他总共收获多少利息。

下面演示通过向大模型提问的方式获得解决方案。15大模型实践实践案例-银行账户利息计算

【提问】:背景:学生在学习C++时,需要理解继承与多态的相关概念。特色:你是一位经验丰富的计算机科学教师,专注于算法和数据结构的教学。技能:你具备深入的算法知识,能够清晰地解释复杂的算法概念。任务:[将上述案例描述内容复制到此]要求:1.从计算思维的角度,详细阐述解题思路,详细解释需要声明多少个类,每个类分别应该具有哪些数据成员和成员函数,它们的作用分别是什么?2.提供C++代码示例,演示如何实现。3.讨论实现时的注意事项和常见错误,特别是类的设计中易错知识点。16大模型实践实践案例-银行账户利息计算

【回复】:解题思路1.类的设计我们需要设计三个类:BankAccount(银行账户类)、CurrentAccount(活期账户类)和FixedAccount(定期账户类)。成员函数:构造函数:初始化账户号码和余额deposit:存款函数withdraw:取款函数staticsetCurrentInterestRate:设置活期利率staticsetFixedInterestRate:设置定期利率staticgetCurrentInterestRate:获取活期利率staticgetFixedInterestRate:获取定期利率(1)BankAccount类数据成员:accountNumber:账户号码balance:账户余额staticcurrentInterestRate:活期利率(静态成员)staticfixedInterestRate:定期利率(静态成员)17大模型实践实践案例-银行账户利息计算

【回复】:(2)CurrentAccount类(继承自BankAccount)成员函数:构造函数:初始化账户号码和余额calculateInterest:根据活期利率和存款天数计算利息(3)FixedAccount类(继承自BankAccount)成员函数:构造函数:初始化账户号码和余额calculateInterest:根据定期利率和存期计算利息18大模型实践实践案例-银行账户利息计算

【回复】:2.C++代码示例#include<iostream>#include<vector>usingnamespacestd;classBankAccount{protected:intaccountNumber;

doublebalance;staticdoublecurrentInterestRate;staticdoublefixedInterestRate;public:

BankAccount(intaccNum,doublebal):accountNumber(accNum),balance(bal){}voiddeposit(doubleamount){

balance+=amount;

}voidwithdraw(doubleamount){if(amount<=balance){balance-=amount;

}else{

cout<<"Insufficientbalance!"<<endl;}

}staticvoidsetCurrentInterestRate(doublerate){

currentInterestRate=rate;

}staticvoidsetFixedInterestRate(doublerate){

fixedInterestRate=rate;

}staticdoublegetCurrentInterestRate(){

returncurrentInterestRate;

}staticdoublegetFixedInterestRate(){returnfixedInterestRate;

}//纯虚函数virtualdoublecalculateInterest(intmonth)=0;};19大模型实践实践案例-银行账户利息计算

【回复】:doubleBankAccount::currentInterestRate=0.0;doubleBankAccount::fixedInterestRate=0.0;classCurrentAccount:publicBankAccount{public:CurrentAccount(intaccNum,doublebal):BankAccount(accNum,bal){}doublecalculateInterest(intmonth)override{

returnbalance*currentInterestRate*month/12;

}};classFixedAccount:publicBankAccount{public:FixedAccount(intaccNum,doublebal):BankAccount(accNum,bal){}doublecalculateInterest(intmonth)override{

returnbalance*fixedInterestRate*month/12;

}};20大模型实践实践案例-银行账户利息计算

【回复】:intmain(){BankAccount::setCurrentInterestRate(0.003);//设置活期利率为0.3%BankAccount::setFixedInterestRate(0.03);//设置定期利率为3%vector<BankAccount*>accounts;accounts.push_back(newCurrentAccount(1001,10000));accounts.push_back(newFixedAccount(2001,20000));accounts.push_back(newCurrentAccount(1002,15000));accounts.push_back(newFixedAccount(2002,25000));doubletotalInterest=0.0;for(BankAccount*accountPtr:accounts){totalInterest+=accountPtr->calculateInterest(24);//假设存期为24个月

}for(BankAccount*account:accounts){deleteaccount;

}//释放动态分配的内存cout<<"Totalinterest:"<<totalInterest<<endl;return0;

}21大模型实践实践案例-银行账户利息计算

【回复】:3.实现时的注意事项和常见错误:静态成员变量的初始化:静态成员变量需要在类外进行初始化。纯虚函数的使用:在基类中声明纯虚函数,以确保派生类必须实现该函数。利率的设置和获取:使用静态成员函数来设置和获取利率,确保所有账户共享相同的利率值。继承和多态:确保派生类正确地继承基类,并实现基类中的纯虚函数。通过以上设计和实现,可以有效地理解继承与多态的概念,并应用于实际的银行账户系统中。22大模型实践实践案例-银行账户利息计算

【回复】:说明:以上代码中,有两个关键点需要认真理解:(1)多态性代码中,多态性通过虚函数和基类指针实现。多态性允许我们在运行时决定调用哪个派生类的函数实现,而不是在编译时决定。其中:virtualdoublecalculateInterest(intmonth)=0;在BankAccount类中声明为纯虚函数。这意味着BankAccount是一个抽象类,不能直接实例化。CurrentAccount和FixedAccount类都重写了calculateInterest函数,并使用override关键字(可以省略)来显式表明它们是重写基类的虚函数。其次,在main函数中,使用vector<BankAccount*>存储BankAccount类的指针,这些指针指向CurrentAccount和FixedAccount对象。23大模型实践实践案例-银行账户利息计算

【回复】:在遍历accounts向量时,通过基类指针调用calculateInterest函数。由于calculateInterest是虚函数,实际调用的是指针所指向对象的具体实现(即CurrentAccount或FixedAccount的calculateInterest实现)。遍历代码为:for(BankAccount*accountPtr:accounts){totalInterest+=accountPtr->calculateInterest(24);//假设存期为24个月}代码中,accountPtr是一个BankAccount类的指针,但它实际指向的是CurrentAccount或FixedAccount对象。调用calculateInterest时,程序会根据指针指向的对象类型调用相应的实现。24大模型实践实践案例-银行账户利息计算

【回复】:(2)静态成员的使用静态成员变量和静态成员函数在类的所有实例之间共享。它们不属于某个特定的对象,而是属于类本身。staticdoublecurrentInterestRate;和staticdoublefixedInterestRate;是BankAccount类的静态成员变量。它们存储活期利率和定期利率,所有BankAccount类的对象共享这些变量。静态成员变量需要在类外进行定义和初始化:doubleBankAccount::currentInterestRate=0.0;doubleBankAccount::fixedInterestRate=0.0;staticvoidsetCurrentInterestRate(doublerate);和staticvoidsetFixedInterestRate(doublerate);是静态成员函数,用于设置静态成员变量的值。静态成员函数可以在不创建类实例的情况下调用:BankAccount::setCurrentInterestRate(0.003);//设置活期利率为0.3%BankAccount::setFixedInterestRate(0.03);//设置定期利率为3%内容导航实践探究大模型探究大模型实践大模型探究26大模型探究探究1

【提问】C++的访问控制权限里,private、protected、public三者的区别是什么?继承方式里,它们三者又是什么区别?27大模型探究探究1

【回复】C++中的private、protected和public是用于控制类成员访问权限和继承行为的关键字。它们的区别体现在以下两方面:一、类成员的访问控制权限关键字访问范围private仅在类内部可以直接访问(友元类/友元函数除外),派生类和外部代码均不可访问。protected在类内部和派生类中可以直接访问,但外部代码不可访问。public类内部、派生类、外部代码均可直接访问。28大模型探究探究1

【回复】示例:classBase{private:inta;//仅Base类内部可访问protected:intb;//Base和派生类可访问public:intc;//全部可访问};classDerived:publicBase{voidfunc(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论