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

有如下类结构:
数类Number:有纯虚函数加法,乘法和打印结果print(),加法,乘法运算用运算符重载,派生类继承这些函数;
分式类Fraction:由类Number公有派生,其数据成员有分子numerator,分母denominator,
整数类Integer:由类Fraction公有派生,有构造函数。
试编写完整的程序,要求:在分式类和整数类中,有构造函数,有相关成员的输入和输出函数,要重写基类的虚函数,在main()中显示相关运算的计算结果。定义分式类函数时,要求检查分母是否为零,如果为零,给出提示信息,程序要完整。

谁出的题啊?好奇怪。加法是对象相加,它有两个操作数,均是该类的对象。
你要求重写,但是,两个不同的类的加号重载函数的参数不可能一样的啊。
基类是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;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

悬赏分数!高分!!C++
你这个问题我已经答过了,在点击按钮的消息响应函数里下断点,看看有没有被调用,如果没有执行到断点处,说明你这个按钮没有添加小心响应函数,请用MFC提供的宏BEGIN_MESSAGE_MAP & END_MAESSAGE_MAP添加消息映射再试一次。还有,按钮显示出来只能说明你WM_PAINT消息函数被正确处理,按钮被绘制出来了,不...

C++友元类出错,跪求大神排错 急急急~~~ (高分悬赏喔)
master(char S[20],char C[20],char N[20],char s,int a,int g):col(S, C, N, s, a){strcpy(col.StuNo,S);strcpy(col.ClaNo,C);strcpy(col.name,N);col.sex=s;col.age=a;grade=g;}

高分悬赏这道题的解法(C或C++,也可以是思路)
假设这三个数是A,B,C(你的m1要多打一个字麻烦。。)B=2*A C=3*A 先分析A,B和C可能出现的数值 首先C是最大的并且是三位数,所以A的百位数只可能是1 2 3 再来看B,应为B是A的两倍,所以B的百位数只可能是2到6之间,3*A的最大值只有987,所以A<325,所以B的百位数只可能到6。...

高分悬赏visual c++编程题
long factorial(int m) \/\/用于求阶乘 { if(m==0||m==1)return 1;else return m*factorial(m-1);} long forSum(int n) \/\/用于求阶乘之和 { int i=0;long y=0;for(i=1;i<=n;i++){ y+=factorial(i);} return y;} include <stdio.h> int main(){ long y=0;int...

分油问题与编程C++,,高分悬赏 要有解释 详细点
第一个题:include <iostream> using namespace std;class Bottle\/\/3个瓶子类 { private:int a; \/\/a---10L的瓶子 int b; \/\/b---7L的瓶子 int c; \/\/c---3L的瓶子 public:Bottle(){ } Bottle(int x,int y,int z){ a = x;b = y;c = z;} \/\/下面是6个倒油的函数 void ...

高分悬赏:C++中如何利用FinWindow()函数查找并关掉任务管理器?_百度...
楼主你好!光用FindWindow()只能找到窗口,并不能关掉。关掉要用TerminateProcess()函数。下面,我就举例说明吧,放在一个按钮的事件代码中。HWND hwnd=::FindWindow(NULL,"Windows 任务管理器");if(hwnd!=NULL){ DWORD dwProcessId;::GetWindowThreadProcessId(hwnd, &dwProcessId);HANDLE handle=...

(高分悬赏)C++停车场管理系统
include <stdio.h>\/*包含了与标准I\/O库有关的变量定义和宏定义*\/ include <stdlib.h>\/*文件包含所用的文件*\/ include<conio.h> include<io.h> int cars[12][4]={{1234,1,1,20},{2345,1,2,15},{3456,1,3,10},{4567,1,4,5},{0,1,5,0},{0,1,6,0},{0,2,1,0},{0...

C语言编写一个程序,急用!!高分悬赏(正确答案追加分数)
void Menu();void Plus();void Minus();void Multiply();void Dir();int main(){ int n, flag = 0;while(1){ Menu();do { flag = 0;scanf("%d", &n);switch(n){ case 1: Plus(); break;case 2: Minus(); break;case 3: Multiply(); break;case 4: Dir(); ...

C++课程设计 高分悬赏C++课程设计“有理数运算”,满意还有追分!
小写了一下,,放在LINUX里编译并且运行过了。代码如下:include <stdio.h> include <math.h> include <sys\/types.h> class CRationalNum { public:int SetRationalNum(int a, int b);int GetA();int GetB();CRationalNum operator+(CRationalNum &rRationNum);CRationalNum operator-(C...

((高分悬赏))受力分析中什么时候可以把系统看做一个整体?(要具体,要...
首先根据楼主的题设,答案是不对的。支持力 = Mg + mg + m*木块竖直方向的分加速度。(这个你可以问一下你的老师,核实一下)1、什么时候可以把系统看做是一个整体。任何系统都可以看做整体来处理(学过微积分的话就很容易明白),采取整 体法只是为了解题的方便,因为采用整体法时不必去关心...

相似回答