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:} 从头开始说起吧...
一、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;
}
现在,你给我解释解释,这是个啥 再说一点吧,既然学的是c++,那就不要用宏了
有比宏更安全的做法,比如 constexpr 的全局变量 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;
}
yuxijian2020 发表于 2021-4-24 20:46
再说一点吧,既然学的是c++,那就不要用宏了
有比宏更安全的做法,比如 constexpr 的全局变量
可是我敢把头上的#define pi 3.14换成constexpr float pi=3.14;就发生了错误?我应该在哪里去定义这个constexpr呢? hyf123? 发表于 2021-4-24 22:50
可是我敢把头上的#define pi 3.14换成constexpr float pi=3.14;就发生了错误?我应该在哪里去定义这个co ...
可能是你用的c++标准没有吧,那你直接用 const 也可以 yuxijian2020 发表于 2021-4-25 08:36
可能是你用的c++标准没有吧,那你直接用 const 也可以
好的
页:
[1]