c++强制操作符==重载接口抽象类
c++ forcing operator == overload from interface abstract class
使用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==
。但你也要求把这个算子变成虚拟的。由于每个子操作符的参数类型将不同于父虚拟方法的参数类型,因此您最终要做的就是隐藏基类操作符。因此,您将永远无法以多态方式调用它,并且比较的虚拟性根本没有用。
相反,我建议只是删除父操作符的虚拟性,并且在使用子类时需要使用 ==
。当它丢失时,编译器会告诉你。
然而,如果你确实需要能够在基对象上多态调用比较,你很可能需要使用双调度之类的东西来确保双方都访问最派生的类型,并验证最派生的类型是相同的(否则比较是没有意义的)。
编辑:如果你真的需要这个功能,我不认为模板基类有什么特别的问题——只要检查你的设计,确保你确实需要它。
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 使用赋值运算符重载从类中返回jobject
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C++:从抽象类重写纯虚拟运算符重载
- C++ 运算符重载,用于使用抽象类<<
- 抽象类的 QDataStream 运算符<<重载
- 抽象类中的 C++ 重载运算符
- 抽象类C++中的增量运算符重载
- 抽象类和重载Ouput运算符
- 运算符== 抽象类和shared_ptr的重载
- operator++(int)重载抽象基类和Wall
- 为什么抽象类的实现看不到重载纯虚函数
- 抽象类中的C++运算符重载
- c++强制操作符==重载接口抽象类