面向对象难题,闲人请进

noho 2002-01-18 02:50:17
class CBase是一个类体系的基类,其它所有的类都从这个类派生
函数Equal原型如下,输入两个对象,比较这两个对象是否相等(不是指针相等!!!)
bool Equal(const CBase & obj1, const CBase & obj2)

bool Equal(const CBase * obj1, const CBase * obj2)
我尝试设计了两种方法
1、
class CBase
{
public:
virtual bool Equal(const CBase & rhs) const = 0;
};
2、
class CBase
{
public:
bool operator==(const CBase & rhs);
};
对于第一种方法,子类必须像下面的代码这样
class CFoo : public CBase
{
public:
virtual bool Equal(const CBase &rhs) const
{
};
};
Equal的实现就必须使用RTTI或者MFC的RUNTIME_CLASS机制,但是这两种机制个人觉得都不太好。
对于第二种方法,由于operator==不是虚的,所以Equal函数调用的是CBase::operator==,如果改成虚的,还会碰上和方法1一样的问题。

当然,在C++中,模板也是一种解决办法,但是不符合基于CBase的类体系。
另外,.NET Framework的Object就有Equals方法,不知道它是怎么实现的?
...全文
105 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
noho 2002-01-22
  • 打赏
  • 举报
回复
// u...p...
Last_Dodo 2002-01-19
  • 打赏
  • 举报
回复
我做过一ASN.1 System碰到类似的问题。我现在很忙,你若e-mail到david_f_deng@hotmail.com。我会找时间e-mail你我是如何做的。
lak47 2002-01-18
  • 打赏
  • 举报
回复
能否这样
CBase{
CBase(long _L):_ID(_L){}
bool operator == (const CBase& _X)const{return _ID == _X._ID;}
long _ID;
};

class CFoo : public CBase
{
enum{FOO_ID =...}
CFoo():CBase(FOO_ID){}
};
就是自己得定义FOO_ID,并保证它们不重复
luxyi 2002-01-18
  • 打赏
  • 举报
回复
yeah, i think use RTTI would be the most appropriate approach. After all, to compare two things which are of a different type is unnatural.
alou 2002-01-18
  • 打赏
  • 举报
回复
RTTI的问题是什么?为什么不采用呢?

class CBase
{
protected:
virtual bool Equal(const CBase & rhs);//simple compare
public:
bool operator==(const CBase & rhs);
};

//operator ==
...
if( typeid(*this) != typeid(rhs) )
return false;
return this->Equal(rhs);

//子类的Equal
//调用父类的Equal,不同,返回false,相同,进行自己的比较。

65,187

社区成员

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

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