hyf123? 发表于 2021-4-24 15:04:31

c++多重继承中的纯虚函数

定义一个抽象类shape,包括公有的计算面积area函数,计算体积volume函数,输出基本信息函数printinfo(三个函数均为纯虚函数)。从shape公有派生point类,增加私有数据成员x,y坐标,以及构造函数,析构函数。从point公有派生circle类,增加私有数据成员半径r,以及构造函数,析构函数。从circle公有派生cylinder类,增加私有数据成员高度h,以及构造函数,析构函数。(在定义三个派生类的过程中,自己考虑需要重定义哪个虚函数)。在main函数中,定义shape类的指针,指向派生类的对象,输出三类对象的基本信息,面积,体积;(将shape指针改为引用再尝试)。
#include<iostream>
using namespace std;
#define pi 3.14
class shape
{
public:
        virtual float area()=0;
        virtual float volume()=0;
        virtual void printinfo()=0;
};
class point: public shape
{
        point(){x=0;y=0;}
public:
        point(float a,float b)
        {
                x=a;
                y=b;
        }
        ~point(){}
        virtual void printinfo()
        {
                cout<<"x="<<x<<" y="<<y<<endl;
        }
private:
        float x;
        float y;
};
class circle: public point
{
public:
        circle(){r=0;}
        circle(float a,float b,float c):point(a,b)
        {
                r=c;
        }
        ~circle(){}
        virtual float area()
        {
                return pi*r*r;
        }
    virtual void printinfo()
        {
                point::printinfo();
                cout<<"area="<<area()<<endl;
        }
private:
        float r;
};
class cylinder: public circle
{
        cylinder(){h=0;circle();}
public:
        cylinder(float a,float b,float c,float d):circle(a,b,c)
        {
                h=d;
        }
        ~cylinder(){}
       
        virtual float volume()
        {
                cout<<h*circle::area();
        }
    virtual void printinfo()
        {
                circle::printinfo();
                cout<<"volume="<<volume()<<endl;;
        }
private:
        float h;
};
int main()
{
        shape *pi;
circle a;
pi=&a;

       
        return 0;
}
       
       


        我目前写的是这个样子 但是错误好多在线求大佬!!{:9_228:}

yuxijian2020 发表于 2021-4-24 20:38:27

从头开始说起吧...

一、shape
首先 基类只要有派生类,基类的析构就一定要是虚函数
然后 记住,shape 你声明了 3 个 纯虚函数

二、point
point 类继承自 shape ,shape 中有 3 个 纯虚函数
你只实现了一个,这时,point 类也是 纯虚函数

三、circle
circle 类继承自 point , 而 point 类中有 2 个没有实现的 纯虚函数
而你只实现了一个, 所以 circle 类也是 纯虚函数

四、cylinder
这个类没啥好说的,继承了 circle 类的 area() 方法,自己实现了另外2个方法

五、main函数
我是没想到,已经在学习 类和对象 的,居然还能犯这种错误
pi 是什么?你可能已经不记得了!
在你整个代码的第三行
#define pi 3.14
你可能不知道 define 意味着什么
意味着,从今往后,pi 就是 3.14
宏定义是直接替换,而不是定义变量
你以为你前面定义了一个变量,现在重新覆盖呢??
你的main函数,编译之后长这样
int main()
{
      shape *3.14;
      circle a;
      3.14 = &a;
      return 0;
}
现在,你给我解释解释,这是个啥

yuxijian2020 发表于 2021-4-24 20:46:58

再说一点吧,既然学的是c++,那就不要用宏了
有比宏更安全的做法,比如 constexpr 的全局变量

hyf123? 发表于 2021-4-24 22:48:45

yuxijian2020 发表于 2021-4-24 20:38
从头开始说起吧...

一、shape


打得时候忘记了,,
我根据大佬你的说法修改了函数,基本可以实现我想要的功能了,感谢大佬!!
#include<iostream>
using namespace std;
#define pi 3.14
class shape
{
public:
        virtual ~shape(){}
        virtual float area()=0;
        virtual float volume()=0;
        virtual void printinfo()=0;
};
class point: public shape
{
public:
        point(){x=0;y=0;}

        point(float a,float b)
        {
                x=a;
                y=b;
        }
        ~point(){}
        virtual float area(){return 0;}
        virtual float volume(){return 0;}
        virtual void printinfo()
        {
                cout<<"x="<<x<<" y="<<y<<endl;
        }
private:
        float x;
        float y;
};
class circle: public point
{
public:
        circle(){r=0;point();}
        circle(float a,float b,float c):point(a,b)
        {
                r=c;
        }
        virtual float volume(){return 0;}
        ~circle(){}
        float returnr()
        {
                return r;
        }
        virtual float area()
        {
                return pi*r*r;
        }
    virtual void printinfo()
        {
                point::printinfo();
                cout<<"r="<<r<<endl;
                cout<<"area="<<area()<<endl;
        }
private:
        float r;
};
class cylinder: public circle
{
public:
        cylinder(){h=0;circle();}

        virtual float area(){return 2*circle::area()+2*pi*circle::returnr()*h;}
        cylinder(float a,float b,float c,float d):circle(a,b,c)
        {
                h=d;
        }
        ~cylinder(){}
       
        virtual float volume()
        {
                return h*circle::area();
        }
    virtual void printinfo()
        {
                cout<<"h="<<h<<endl;               
                circle::printinfo();
                cout<<"volume="<<volume()<<endl;;
        }
private:
        float h;
};
int main()
{

        shape *p;
point a(1,2);
circle b(1,2,3);
cylinder c(1,2,3,4);
p=&a;
cout<<"shape"<<endl;
p->printinfo();
p=&b;
cout<<"circle"<<endl;
p->printinfo();
p=&c;
cout<<"cylinder"<<endl;
p->printinfo();       
        return 0;
}
       
       


       

hyf123? 发表于 2021-4-24 22:50:41

yuxijian2020 发表于 2021-4-24 20:46
再说一点吧,既然学的是c++,那就不要用宏了
有比宏更安全的做法,比如 constexpr 的全局变量

可是我敢把头上的#define pi 3.14换成constexpr float pi=3.14;就发生了错误?我应该在哪里去定义这个constexpr呢?

yuxijian2020 发表于 2021-4-25 08:36:25

hyf123? 发表于 2021-4-24 22:50
可是我敢把头上的#define pi 3.14换成constexpr float pi=3.14;就发生了错误?我应该在哪里去定义这个co ...

可能是你用的c++标准没有吧,那你直接用 const 也可以

hyf123? 发表于 2021-4-25 15:42:16

yuxijian2020 发表于 2021-4-25 08:36
可能是你用的c++标准没有吧,那你直接用 const 也可以

好的
页: [1]
查看完整版本: c++多重继承中的纯虚函数