【发布时间】:2013-01-01 15:28:13
【问题描述】:
在 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; 不是强制性的。
我想以任何继承者 X 都必须实现的方式修改 IBase 类
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>,这对于任何可能查看的未来开发人员来说都是令人困惑和不清楚的我的代码。
有什么想法吗?
【问题讨论】:
-
为什么?我是认真的——你想要这个的原因会改变你得到的答案。你打算如何使用
operator==之类的类? -
您正在定义一系列具有不同参数类型的虚函数......这些不适用于多态性。
-
您建议的模板方法相当普遍,因此只要准确反映您的设计目标,我就不会将其归类为“令人困惑和不清楚”。不过,我不确定为什么在您的示例中您没有将基类版本设为纯虚拟。
-
欧文,我错误地没有把它变成纯虚拟的。修复。模板方法有几个缺点。其中包括 Ben 建议的多态性问题。 Yakk - 我需要这个实现的原因是因为类 CinheritClass 最终是第三类的一部分,它的实现需要运算符重载
-
你的解决方案其实很合理,一点也不混乱。很多开发者都熟悉CRTP,不熟悉的开发者应该学习一下。 .NET 语言现在使用 CRTP 来指定例如
IComparable界面,方式与您所做的非常相似。
标签: c++ operator-overloading abstract-class