`
桔红糕
  • 浏览: 42524 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

题0802

    博客分类:
  • CPP
阅读更多
引用
先撰写一个数值类型的基类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);


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics