(问题:构造函数的多继承)(图形输出(抽象类+多层继承))

在多继承问题中,子类构造函数在调用非基类的父类构造函数时,通过父类初始化的基类变量貌似会出现置0或高精度数字等不符合预期的乱码。并且直属于该子类的父类变量执行正常。

由于问题出现在越级(比如:基类)的父类身上,故此决定优化为直接从越级的构造函数开始调用,并辅助以直接初始化变量的方式来定义所需变量。

在将调用的构造函数改为(基类调用+(父类)::(变量)赋值)的初始化方式时,问题得到解决。

怀疑是拷贝构造的问题?

问题发现于该题:

 图形输出(抽象类+多层继承)

时间限制1s

内存限制128MB

题目描述

定义一个抽象类Shape,包含三个数据成员:名称、x和y坐标

包含五个虚函数分别是:名称以及x和y的get方法,求面积(返回0.0)、求体积(返回0.0)

包含一个纯虚函数shapeName,用于设置名称。

----

定义Point类继承Shape,在构造函数初始化x和y坐标,设置名称为"Point"

定义Circle类继承Point,新增数据r表示半径,设置名称为"Circle",其他函数根据需要自己编写

定义Cylinder类继承Circle,新增数据h表示高度,设置名称为"Cylinder",其他函数根据需要自己编写

要求上述派生类的设置名称不是在构造函数,是在........

----

编写一个全局函数Print,无返回值,含单个参数为Shape*类型,功能是输出图形的五个信息:名称、x和y坐标、面积、体积,要求输出必须使用抽象类的五个虚函数输出五个信息

输出格式看参考样例,面积和体积只需要输出整数部分(非四舍五入),圆周率为3.14159

要求程序中必须使用抽象类的......来创建Point、Circle、Cylinder类对象

输入

第一行输入一个点的X和Y坐标

第二行输入一个圆的X和Y坐标、半径

第三行输入一个柱体的X和Y坐标、半径、高度

输出

要求调用Print方法输出图形的信息,每个图形输出一行。

输入样例1输出样例1
1.1 2.2\n
3.3 4.4 5.5\n
6.6 7.7 8
Point--(1.1,2.2)--0--0\n
Circle--(3.3,4.4)--95--0\n
Cylinder--(6.6,7.7)--1033--2408\n

#include<iostream>

using namespace std;
float pi=3.14159;
class Shape{
protected:
    string name;
    float x,y;
public:
    Shape(){}
    Shape(float a,float b):x(a),y(b){}
    Shape(string a,float b,float c):name(a),x(b),y(c){}
    string virtual getn(){return name;}
    float virtual getx(){return x;}
    float virtual gety(){return y;}
    float virtual gets(){return 0.0;}
    float virtual getv(){return 0.0;}
    void virtual shapeName()=0;
};
class Point:public virtual Shape{
public:
    Point(){}
    Point(float a,float b):Shape(a,b){}
    void shapeName(){
        name="Point";
    }
    string virtual getn(){return name;}
    float virtual getx(){return x;}
    float virtual gety(){return y;}
    float virtual gets(){return 0.0;}
    float virtual getv(){return 0.0;}
};
class Circle:public virtual Point{
protected:
    float r;
public:
    Circle(){}
//  Circle(float a,float b,float r):Point(a,b),r(r){//a,b将与预期(题目)不符
    }
    Circle(float a,float b,float r):Shape(a,b),r(r){
    }
    void shapeName(){
        name="Circle";
    }
    string virtual getn(){return name;}
    float virtual getx(){return x;}
    float virtual gety(){return y;}
    float virtual gets(){return r*r*pi;}
    float virtual getv(){return 0.0;}
};
class Cylinder:public virtual Circle{
    float h;
public:
    Cylinder(){}
//    Cylinder(float a,float b,float r,float h):Circle(a,b,r),h(h){}//a,b将与预期(题目)不符
    Cylinder(float a,float b,float r,float h):Shape(a,b),h(h){
        Circle::r=r;
    }
    void shapeName(){
        name="Cylinder";
    }
    string virtual getn(){return name;}
    float virtual getx(){return x;}
    float virtual gety(){return y;}
    float virtual gets(){return 2*pi*r*h+2*r*r*pi;}
    float virtual getv(){return Circle::gets()*h;}
};
void Print(Shape *p){
    cout<<p->getn()<<"--("<<p->getx()<<","<<p->gety()<<")--"<<(int)p->gets()<<"--"<<(int)p->getv()<<endl;
}
int main(){
    float x,y,r,h;
    Shape *s;
    cin>>x>>y;
    Point p(x,y);
    p.shapeName();
    s=&p;
    Print(s);
    cin>>x>>y>>r;
    Circle c(x,y,r);
    c.shapeName();
    s=&c;
    Print(s);
    cin>>x>>y>>r>>h;
    Cylinder cy(x,y,r,h);
    cy.shapeName();
    s=&cy;
    Print(s);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值