请教一道C++题目

a_555_a 2008-06-27 09:39:57
题目如下:
某公司现有以下设备:普通电视机、DVD、带DVD的电视机,带DVD的电视机的售价为普通电视机和DVD单价之和的80%,要求对所有的库存设备都能按照品名进行显示、查找、增加和删除、保存的功能。
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统的设计中,至少要用到面向对象的一种机制。
我的类设计如下:
定义抽象类manage(设备管理):
class manage
{public:
virtual double cost()=0;
};

定义manage的派生类normaltv(普通电视机):
class normaltv:public manage
{ double x;
public:
normaltv(double x1){x=x1;}
double cost()
{return x;}
};

定义manage的派生类dvd(DVD):
class dvd:public manage
{ double y;
public:
dvd(double y1){y=y1;}
double cost()
{return y;}
};

定义由normaltv和dvd共同派生出来的派生类dvdtv(带DVD的电视机):
class dvdtv:public normaltv,public dvd
{ double z;
public:
dvdtv(double m,double n):normaltv(m),dvd(n){z=0.8*(m+n);}
double cost()
{return z;}
};

但是老师说我设计的不好,没有用到面向对象的思想.我不是很清楚.请指教一下该如何设计这道题目的类.
...全文
421 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
simb 2008-06-30
  • 打赏
  • 举报
回复
xkyx_cn 的设计更加灵活一些。
grellen 2008-06-30
  • 打赏
  • 举报
回复
mark
a_555_a 2008-06-30
  • 打赏
  • 举报
回复
依照这个题目,这个类里还可以加些什么属性呢?我总觉得光计算个价格是不是太空洞拉?
li_ping_nan 2008-06-27
  • 打赏
  • 举报
回复
虚拟继承
tmxk5028 2008-06-27
  • 打赏
  • 举报
回复
mark
xkyx_cn 2008-06-27
  • 打赏
  • 举报
回复
思路之一:dvd tv 从 tv继承,但是包含一个dvd成员,这样方便于用容器进行管理

个人的意见,肯定还有更好的方案


#include <iostream>
#include <string>

using namespace std;

class device
{
public:
device(const string& m, double c, time_t d) : name(m), cost(c), date(d) {}
virtual ~device() {}

virtual string get_name() = 0;
virtual double get_cost() = 0;
virtual time_t get_date() = 0;

protected:
string name;
double cost;
time_t date;
};

class tv : public device
{
public:
tv(const string& m, double c, time_t d) : device(m, c, d) {}

virtual string get_name() { return name; }
virtual double get_cost() { return cost; }
virtual time_t get_date() { return date; }
};

class dvd : public device
{
public:
dvd(const string& m, double c, time_t d) : device(m, c, d) {}

virtual string get_name() { return name; }
virtual double get_cost() { return cost; }
virtual time_t get_date() { return date; }
};

// using composition
class dvdtv : public tv
{
public:
dvdtv(const string& m, double c, time_t d, const dvd& _dvd) :
tv(m, c, d), tv_dvd(_dvd)
{}

virtual string get_name() { return name; }
virtual double get_cost() { return 0.8 * (cost + tv_dvd.get_cost()); }
virtual time_t get_date() { return date; }

private:
dvd tv_dvd;
};

int main(void)
{

return 0;
}
zjw6861982 2008-06-27
  • 打赏
  • 举报
回复
搬个凳子坐下来看
yyyapple 2008-06-27
  • 打赏
  • 举报
回复
C++的面向对象3个特性:
1.封装。
2.继承。
3.多态。

估计老师考你这3个机制

baihacker 2008-06-27
  • 打赏
  • 举报
回复

//还有很多得自己来.

class manage
{
public:
virtual double cost()=0;
virtual ~manage(){}
};


class normaltv:public virtual manage
{
double x;
public:
normaltv(double x1=0){x=x1;}
double cost()
{return x;}
};

class dvd:public virtual manage
{
double y;
public:
dvd(double y1=0){y=y1;}
double cost()
{return y;}
};

class dvdtv:public virtual manage, public normaltv,public dvd
{
double z;
public:
dvdtv(double m=0,double n=0):normaltv(m),dvd(n){z=0.8*(m+n);}
double cost()
{return z;}
};
baihacker 2008-06-27
  • 打赏
  • 举报
回复
嗯,用结合代替继承我也想过,但是如何做到子类型多态呢?
a_555_a 2008-06-27
  • 打赏
  • 举报
回复
不好意思.偶是菜鸟,能不能麻烦帮我这个类写一下?还有你说的这里的继承关系有点乱,那如果是你,你第一反应会是怎么写的?可能你光说我不是很能理解.最好是能详细的写一下.谢谢.
babyvox1999 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hai040 的回复:]
不如dvdtv也直接继承manage,再包含两个成员dvd和tv
感觉这样清晰点,也不用虚继承
[/Quote]
hai040 2008-06-27
  • 打赏
  • 举报
回复
不如dvdtv也直接继承manage,再包含两个成员dvd和tv
感觉这样清晰点,也不用虚继承
baihacker 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 k2eats 的回复:]
class dvdtv:public normaltv,public dvd
{ double z;
public:
dvdtv(double m,double n):normaltv(m),dvd(n){z=0.8*(m+n);}
double cost()
{return z;}
};
这个要用虚拟继承
而且需要定义一个默认构造函数
[/Quote]
normaltv和dvd
对manage的继承也要用virtual

另外manage应该换个名字吧,比如device
baihacker 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 li_ping_nan 的回复:]
引用 3 楼 baihacker 的回复:
你这里的继承关系有点乱,如果一定要用这种,需要用虚拟继承.
基类最好写个虚析构函数.
没有用到面向对象的思想...这个太广泛了.

baihacker,你对这个问题的解释好象不太好,有点不明白,"太广泛"是指.....
[/Quote]
虚拟继承是指他这里没有用到,而导致可能的错误.

至于面向对象的思想,我也不知道老师想说啥.
在这里估计就是用来给分的几个知识点.
K行天下 2008-06-27
  • 打赏
  • 举报
回复
class dvdtv:public normaltv,public dvd
{ double z;
public:
dvdtv(double m,double n):normaltv(m),dvd(n){z=0.8*(m+n);}
double cost()
{return z;}
};
这个要用虚拟继承
而且需要定义一个默认构造函数
li_ping_nan 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baihacker 的回复:]
你这里的继承关系有点乱,如果一定要用这种,需要用虚拟继承.
基类最好写个虚析构函数.
没有用到面向对象的思想...这个太广泛了.
[/Quote]
baihacker,你对这个问题的解释好象不太好,有点不明白,"太广泛"是指.....
baihacker 2008-06-27
  • 打赏
  • 举报
回复
你这里的继承关系有点乱,如果一定要用这种,需要用虚拟继承.
基类最好写个虚析构函数.
没有用到面向对象的思想...这个太广泛了.
OutIT人 2008-06-27
  • 打赏
  • 举报
回复
baihacker 2008-06-27
  • 打赏
  • 举报
回复
先mark.
加载更多回复(6)

64,698

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧