c++强制操作符==重载接口抽象类

c++ forcing operator == overload from interface abstract class

本文关键字:重载 抽象类 接口 操作符 c++      更新时间:2023-10-16

使用c++上的接口(抽象类),我需要强制继承该接口以外的任何类实现操作符==。考虑这种情况:

class IBase
{
   virtual void someFunc() const = 0; 
}
class CInheritClass : public IBase
{
   virtual void someFunc() const; 
   virtual bool operator== ( const CInheritClass& obj ) const;
}
void main()
{
  CInheritClass instance;
}

类CInheritClass必须实现someFunc,因为它继承了Ibase,实现virtual bool operator== ( const CInheritClass& obj ) const;不是强制的。我想修改IBase类的方式,任何继承者X都必须实现

virtual bool operator== ( const X& obj ) const

下面的代码可以工作:

template<class X>
class IBase
{
   virtual void someFunc() const = 0; 
   virtual bool operator== ( const X& obj ) const = 0;
}
class CInheritClass : public IBase<CInheritClass>
{
   virtual void someFunc() const; 
   virtual bool operator== ( const CInheritClass& obj ) const;
}

但我是在一个不使用模板的解决方案之后,因为每个希望实现IBase的类都必须继承IBase本身作为模板类class X : public IBase<X>,这对任何未来的开发人员来说都是混乱和不清楚的,可能会看到我的代码。你知道吗?

使用纯虚函数声明

virtual bool operator== ( const IBase& obj ) const = 0;

实现示例:

bool CInheritClass ::operator==( const IBase& obj ) const
{
     const CInheritClass *o = dynamic_cast<const CInheritClass*>(&obj);
     if (o == NULL) return false;
     // TODO
}

输入类型应该是基类,否则你将无法对基对象进行多态调用比较

对于从模板继承的想法:警告,基类在两个派生类之间不再相同。基类的目的改变了:使用模板你只是共享代码,强迫用户实现函数,防止两个派生类之间的代码重复

这真的取决于你想做什么。这可能是一个好的设计,也可能不是…

仅供参考,模板版本通常被称为"Barton-Nackman技巧":http://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick

如果你想让你的派生类只与自己类型的其他对象相比较(而不是抽象基类类型),那么这就是要使用的"技巧"。

编辑:这类似于Java实现Comparable接口的方式,所以它不是(好的)程序员不知道发生了什么:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

让我们来分析一下你的要求。你想要强迫每个子元素都使用自己的右侧类型来实现operator==。但你也要求把这个算子变成虚拟的。由于每个子操作符的参数类型将不同于父虚拟方法的参数类型,因此您最终要做的就是隐藏基类操作符。因此,您将永远无法以多态方式调用它,并且比较的虚拟性根本没有用。

相反,我建议只是删除父操作符的虚拟性,并且在使用子类时需要使用 ==。当它丢失时,编译器会告诉你。

然而,如果你确实需要能够在基对象上多态调用比较,你很可能需要使用双调度之类的东西来确保双方都访问最派生的类型,并验证最派生的类型是相同的(否则比较是没有意义的)。

编辑:如果你真的需要这个功能,我不认为模板基类有什么特别的问题——只要检查你的设计,确保你确实需要它。