题0802

[quote]先撰写一个数值类型的基类MyNumeric,要求能够提供这样一些接口:
两个该类对象的减法
两个该类对象的= =比较
两个该类对象的!=比较。
然后实现一个从MyNumeric派生而来的具体的复数(形如a+bi,a称为实部,b称为虚部)类MyComplex。除了实现MyNumeric规定的接口之外,MyComplex还应该实现:
一个缺省构造函数(实部和虚部初始为0)
一个接受两个整型作为其实部和虚部初始值的构造函数
一个支持复数对象和标准整型减法操作(形如Cp - 5,即5和Cp的实部相减虚部不变)
注:一个标准整型和一个复数对象相减的操作不要求(即形如5 - Cp)
[/quote]

基础知识
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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值