关于类继承架构

xy365 2010-01-07 03:05:05
请设计一个可以反应出下面关系的类继承构架:
“X要么是Y,要么就是Z”
在此,我们假设Y和Z的派生集之间没有交集。
...全文
272 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2010-01-12
  • 打赏
  • 举报
回复
哪本书在哪个主题章节的习题啊?
楼主啊,你能不能先google “提问的智慧”看看,好节省点大家的时间啊。
xy365 2010-01-12
  • 打赏
  • 举报
回复
这个是书上的一个题目。
至于现实中类似的需求的话,就比如:有一个数值变量,它要么是模拟变量,要么是数字变量。一个数值不可能又是模拟变量又是数字变量的,或者既不是模拟变量,也不是是数字变量的。
zhuxueling 2010-01-12
  • 打赏
  • 举报
回复
#if USE_X
# define X Y
#else
# define X Z
#endif
yshuise 2010-01-12
  • 打赏
  • 举报
回复

template <typename C>
class X: public C
{

};

class AFactory
{
public:
X* createXY(){return new X<Y>;}
X* createXZ(){return new X<Z>;}
};
}
yxyxp2008 2010-01-12
  • 打赏
  • 举报
回复
x是y或x是z
这个‘是’如果理解成相同,相等,那么x就是基类,那就成了用基类指针访问子类,那就可以弄成14楼说的工厂。
这个‘是’如果理解成从属于,那么x就是子类,那就是从y或z派生来的,那就把12楼和16楼的综合一下。
但这个‘是’应该更偏重于对象x,而不是指针,所以觉得用模板类解决好些。
IT_lau 2010-01-11
  • 打赏
  • 举报
回复
ty[Quote=引用 14 楼 lvp1984 的回复:]
引用楼主 xy365 的回复:
请设计一个可以反应出下面关系的类继承构架:
“X要么是Y,要么就是Z”
在此,我们假设Y和Z的派生集之间没有交集。

弄个工厂不就行了,免得用户随意实例化你的类
[/Quote]
lvp1984 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 xy365 的回复:]
请设计一个可以反应出下面关系的类继承构架:
“X要么是Y,要么就是Z”
在此,我们假设Y和Z的派生集之间没有交集。

[/Quote]弄个工厂不就行了,免得用户随意实例化你的类
ImJaden 2010-01-11
  • 打赏
  • 举报
回复
呵呵,看一下。
SammyLan 2010-01-11
  • 打赏
  • 举报
回复
class Y{};

class Z{};

template<class T>
class X;

template<>
class X<Y>:public Y{};

template<>
class X<Z>:public Z{};


好吧,这样X的对象就可以是要么是Y,要么是Z,不可能同时是Y和Z了,更不可能是其它了
taodm 2010-01-11
  • 打赏
  • 举报
回复
自己多写代码验证。
xy365 2010-01-11
  • 打赏
  • 举报
回复
taodm

(taodm(不能处理站内信))

不是解读。

两个基类类之间如果没有交集,确实是就不能使用多重继承。你的意思是没有交集,还可以将两个类作为基类使用多重继承吗?
taodm 2010-01-11
  • 打赏
  • 举报
回复
囧,
“在此,我们假设Y和Z的派生集之间没有交集。 ”
被读解出
“两个类之间如果没有交集,就不能使用多重继承。 ”
xy365 2010-01-11
  • 打赏
  • 举报
回复
两个类之间如果没有交集,就不能使用多重继承。
因此,要实现如题要求的方法,可以考虑设置包含智能指针(可以通过引用计数,句柄类实现)的X类指向Y类或Z类。
yshuise 2010-01-11
  • 打赏
  • 举报
回复
怎么使用是客户的事情。
taodm 2010-01-11
  • 打赏
  • 举报
回复
大家还是先等楼主搞清楚自己的真实、原始需求后再开始浪费脑细胞吧。
SammyLan 2010-01-11
  • 打赏
  • 举报
回复
那不派生
class YY{};
X<YY> yy;yy既不是Y也不是Z吧?
yshuise 2010-01-11
  • 打赏
  • 举报
回复
继承D干啥?
我还能
#define private public
呢?
SammyLan 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yshuise 的回复:]
很简单啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

template <typename C>
class X: public C
{

};
[/Quote]

你这样的话还是可以同时为Y和Z的
比如
class D:public Y,public Z{}
X<D> d;那d就既是Y又是Z了
yshuise 2010-01-11
  • 打赏
  • 举报
回复
很简单啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

template<typename C>
class X: public C
{

};
wyjjsn 2010-01-07
  • 打赏
  • 举报
回复
可以使用模板类。
加载更多回复(6)

64,660

社区成员

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

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