1

我有一个派生类,它是一个非常薄的基类包装器。基本上,我有一个类,它有两种可以根据你解释它的方式进行比较的类,所以我创建了一个从基类派生的新类,并且只有新的构造函数(只委托给基类)和一个新的operator==. 我想做的是operator Base&()在派生类中重载,所以在我需要将其解释为基础的情况下。

例如:

class Base
{
  Base(stuff);
  Base(const Base& that);
  bool operator==(Base& rhs); //typical equality test
};

class Derived : public Base
{
  Derived(stuff) : Base(stuff) {};
  Derived(const Base& that) : Base(that) {};
  Derived(const Derived& that) : Base(that) {};
  bool operator==(Derived& rhs); //special case equality test
  operator Base&()
  {
    return (Base&)*this;  //Is this OK?  It seems wrong to me.
  }
};

如果你想要一个我想要做的简单示例,假设我有一个 String 类,并且String==String是典型的逐字符比较。但是我创建了一个新类CaseInsensitiveString,它进行了不区分大小写的比较,CaseInsensitiveString==CaseInsensitiveString但在所有其他情况下,它的行为就像一个字符串。它甚至没有任何新的数据成员,只是一个重载的operator==. (请不要告诉我使用 std::string,这只是一个例子!)

我这样做对吗?有些东西看起来很可疑,但我不能指望它。

4

2 回答 2

2

由于您是公开Derived派生的,因此您已经可以转换为. 没有必要实施任何额外的东西。BaseDerivedBase &

此外,当涉及到转换运算符本身时,您做对还是错是一个没有实际意义的问题,因为无论如何您的转换运算符都不会被使用。派生到基础的转换始终由内置方法处理。如果您为转换提供自己的运算符(如上所述),它将被忽略。

我不明白您打算如何使用 if 以不同的比较方法来解决原始问题。

于 2010-05-21T17:32:35.770 回答
2

由于您使用公共继承,C++ 将自动执行您尝试实现的转换。没有必要自己做。

但是,我认为这不一定是对继承的良好使用。您只是在这里使用它,没有任何虚函数,只是为了有效地组合子类。通常派生类来改变行为,而不是重用它。

我认为更好的是简单地创建一个外部算法。由于缺少虚函数,您无论如何都不能用基指针/引用代替,所以不要转换为派生类来强制进行显式比较,只需调用(可能是朋友)独立方法来进行不区分大小写的比较。如果您需要在运行时动态更改它,您甚至可以传递算法(使用函子)。

于 2010-05-21T19:06:30.113 回答