引用
先撰写一个数值类型的基类MyNumeric,要求能够提供这样一些接口:
两个该类对象的减法
两个该类对象的= =比较
两个该类对象的!=比较。
然后实现一个从MyNumeric派生而来的具体的复数(形如a+bi,a称为实部,b称为虚部)类MyComplex。除了实现MyNumeric规定的接口之外,MyComplex还应该实现:
一个缺省构造函数(实部和虚部初始为0)
一个接受两个整型作为其实部和虚部初始值的构造函数
一个支持复数对象和标准整型减法操作(形如Cp - 5,即5和Cp的实部相减虚部不变)
注:一个标准整型和一个复数对象相减的操作不要求(即形如5 - Cp)
基础知识
1.类和继承
class MyComplex : public MyNumeric
2.构造函数
MyComplex();
MyComplex(int i, int j);
3.操作符重载
MyComplex operator-(int n);
bool operator==(MyNumeric& n) const;
bool operator!=(MyNumeric& n) const;
4.接口,也就是纯虚函数
public:
virtual MyNumeric* minus(const MyNumeric& n,MyNumeric* result) const=0;
virtual bool operator==(MyNumeric& n) const=0;
virtual bool operator!=(MyNumeric& n) const =0;
这里面有几个问题要注意:
1)具有纯虚函数的类是抽象类-》抽象类不能被实例化-》无论在传递参数或传递返回值时不能使用值传递的方式,只能传递地址(也就是指针或者引用)
MyNumeric* minus(const MyNumeric& n,MyNumeric* result) //可以
MyNumeric minus(const MyNumeric n,MyNumeric result)//错误,编译不会通过
2)-操作符重载返回值类型,-=操作符返回引用类型
class Integer
{
private:
int i;
public:
Integer(int param):i(param){}
Integer operator-(const Integer& param) const
{
Integer result(this->i-param.i);
return result
}
Integer& operator-=(const Integer& param)
{
this->i -= param.i;
return *this;
}
}
这是因为一般情况下,返回地址类型效率更高一点,所以推荐返回地址类型。
但是operator-要返回的是一个局部变量,局部变量在函数结束后自动销毁,如果返回地址,在调用该函数之后,调用它的代码块将要错误使用一个地址指向已经被销毁的对象。而返回值,系统将会使用copy构造函数复制局部变量至调用代码中的接收对象。局部变量销毁后,不会影响接收对象的生存周期。
3)我们的减操作,因为第1点,不能返回值,因为第2点应该返回值。解决方案是,额外传递一个接收结果的对象的地址入参,以确保函数结束后,接收结果的对象不会被销毁
MyNumeric minus(const MyNumeric& n) const=0;//由于返回的是值,和抽象类冲突,编译失败
MyNumeric* minus(const MyNumeric& n) const=0;//由于返回的是局部变量的地址,执行结果出错。
MyNumeric* minus(const MyNumeric& n,MyNumeric* result) const=0;
5.虚函数重写
虚函数重写,要求子类中的函数和父类的函数,函数名,参数类型,返回类型,完全一样,包括const的声明也必须一致。唯一可以有不同的是返回的类型如果是地址,重写的函数可以返回父函数返回类型的子类型。
MyComplex* minus(const MyNumeric& n,MyNumeric* result) const=0;
6.RTTI实时类型识别
2个函数实现实时类型识别:
typeid 返回对象实际类型
dynamic_cast 将基类型指针或引用安全的转换成派生类的指针或引用
if (typeid(n) != typeid(*this)) throw new exception("必须同类对象相减");
if (typeid(*result) != typeid(*this)) throw new exception("相减结果也放在相同类型中");
const MyComplex & another = dynamic_cast<const MyComplex &>(n);
MyComplex * resultComplex = dynamic_cast<MyComplex *>(result);
分享到:
相关推荐
网工必备2024/华三/H3CIE题库GB0-801
这个名为“0802、闪光的摆.rar”的压缩包文件,显然是为参与此类竞赛的学生提供的一种学习资源。它包含了历年竞赛的相关资料、试题、解决方案以及可能的源代码,对于参赛者或者对电子设计感兴趣的同学来说,是非常...
### 上机实验题一、二知识点解析 #### 实验背景及目标 本次上机实验的主要目的是让学生们熟悉SQL Server 2012系统的操作,并掌握如何使用SQL Server Management Studio(SSMS)工具以及T-SQL语言来创建数据库和...
赫斯曼系列交换机包括MACH4002系列模块化核心交换机和MS30-0802SAAPHC系列模块化交换机。MACH4002系列交换机有两种类型:MACH4002 48G-L3P和MACH4002 48+4G-L3P。MACH4002 48G-L3P是一个全千兆模块化工业以太网核心...
9. **随机数表抽样**:从随机数表中按照指定方法选取个体,选取的编号是连续的,因此第6个个体的编号是按照顺序选取的,前5个编号分别是0802、0702、4369、9728、0198,第6个编号为3204。 以上就是题目涉及的主要...
0802:MOV R2,8 ;微指令条数 0804:MOV R3,100;微码在微控制存储器中的首地址 0806:LDMC ;加载微码指令,将微码指令加载到微控制存储器中 0807:RET 0808: 用"G"命令运行加载微码的程序: >G800 微码便...
- 机械工程一级学科(学科代码:0802) - 机械类全日制专业学位(学科代码:0855) #### 二、题型结构 - **填空题** - **选择题** - **作图题** - **计算题** 这些题型旨在全面考察考生对机械原理的理解程度。 ...
本篇将基于给定的“计算机0802”课程材料,深入解析两个核心用例——取款与存款,在UML视角下的详细流程、参与者、前置条件、后置条件以及异常处理机制,以此揭示银行系统管理的内在逻辑。 ### 取款用例描述 #### ...
在问题172中,这个语句查询0801班和0802班的学生信息,因此答案是A。 4. 数据插入:在VFP中,使用`INSERT INTO`语句向表中添加记录。问题173中,正确执行的SQL语句是B,因为它提供了完整的学号、姓名和性别字段,...