求解C++答案,急!!!高分悬赏

有如下类结构:数类Number:有纯虚函数加法,乘法和打印结果print(),加法,乘法运算用运算符重载,派生类继承这些函数;分式类Fraction:由类Number公有... 有如下类结构:
数类Number:有纯虚函数加法,乘法和打印结果print(),加法,乘法运算用运算符重载,派生类继承这些函数;
分式类Fraction:由类Number公有派生,其数据成员有分子numerator,分母denominator,
整数类Integer:由类Fraction公有派生,有构造函数。
试编写完整的程序,要求:在分式类和整数类中,有构造函数,有相关成员的输入和输出函数,要重写基类的虚函数,在main()中显示相关运算的计算结果。定义分式类函数时,要求检查分母是否为零,如果为零,给出提示信息,程序要完整。
展开
 我来答
水晶扇
2010-09-16 · TA获得超过1536个赞
知道大有可为答主
回答量:837
采纳率:100%
帮助的人:1092万
展开全部
谁出的题啊?好奇怪。加法是对象相加,它有两个操作数,均是该类的对象。
你要求重写,但是,两个不同的类的加号重载函数的参数不可能一样的啊。
基类是Number,应该写成:Number operator+(Number& other)
子类是Fraction,应该写成 Fraction operator+(Fraction& other)
这样的模式无法继承。
只能参数改成指针了,这样不符合“加法”的“原则”。不过也没办法了。

#include <iostream>
using namespace std;
class Number
{
public:
virtual Number* operator+(Number* other)=0;
virtual Number* operator*(Number* other)=0;
virtual void print()=0;
};

class Fraction:public Number
{
public:
Fraction() //调用无参构造函数,要求输入
{
GetNumerator();
GetDenominator();
while(denominator==0)
{
cerr<<"分母不能为零"<<endl;
GetDenominator();
}
}

Fraction(int n,int d) //调用有参构造函数,不用输入
{
numerator=n;
denominator=d;
while(denominator==0)
{
cerr<<"分母不能为零"<<endl;
GetDenominator();
}
}
~Fraction()
{
}

Number* operator+(Number* oth)
{
Fraction*rt =new Fraction(0,1);
Fraction* other=(Fraction*)oth;
rt->numerator=(this->denominator*other->numerator+this->numerator*other->denominator);
rt->denominator=this->denominator*other->denominator;
return rt;
}

Number* operator*(Number*oth)
{
Fraction*rt =new Fraction(0,1);
Fraction* other=(Fraction*)oth;
rt->numerator=other->numerator*this->numerator;
rt->denominator=this->denominator*other->denominator;
return rt;
}

void print()
{
int a=abs(numerator),b=abs(denominator);
while(a!=0&&b!=0) a<b?b-=a:a-=b;
int k=((a==0) ? b : a);
if(denominator!=k && denominator!=-k)
cout<<numerator/k<<"/"<<denominator/k;
else if(denominator==k)
cout<<numerator/k;
else
cout<<-numerator/k;
}

void GetNumerator()
{
cout<<"请输入分子:";
cin>>numerator;
}
void GetDenominator()
{
cout<<"请输入分母:";
cin>>denominator;
}

protected:
int numerator;
int denominator;
};

class Integer:public Fraction
{
public:
Integer():Fraction(0,1) //调用无参构造函数,要求输入
{
GetNumber();
}

Integer(int t):Fraction(t,1) //调用有参构造函数,不用输入
{
}

~Integer()
{
}

Number* operator+(Number* oth)
{
Integer* rt=new Integer(0);
Integer* other=(Integer*)oth;
rt->numerator=this->numerator+other->numerator;
return rt;
}
Number* operator*(Number* oth)
{
Integer* rt=new Integer(0);
Integer* other=(Integer*)oth;
rt->numerator=this->numerator*other->numerator;
return rt;
}
void print()
{
cout<<numerator;
}
void GetNumber()
{
cout<<"请输入一个整数:";
cin>>numerator;
}
}

main()
{
Fraction aa,bb(2,3); //构造说明,传两个参数,或者不传;不传就要输入。
Fraction*pcc=(Fraction*)(aa+(&bb));
Fraction*pdd=(Fraction*)(aa*(&bb));

aa.print();
cout<<" + ";
bb.print();
cout<<" = ";
pcc->print();
delete pcc;
cout<<endl;

aa.print();
cout<<" * ";
bb.print();
cout<<" = ";
pdd->print();
delete pdd;
cout<<endl;

Integer a(4),b; //构造说明,传一个参数,或者不传;不传就要输入。
Integer*pc=(Integer*)(a+(&b));
Integer*pd=(Integer*)(a*(&b));

a.print();
cout<<" + ";
b.print();
cout<<" = ";
pc->print();
delete pc;
cout<<endl;

a.print();
cout<<" * ";
b.print();
cout<<" = ";
pd->print();
delete pd;
cout<<endl;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式