C++ 将运算符强制转换为精简包装器派生类中的基类

C++ 将运算符强制转换为精简包装器派生类中的基类,c++,typecast-operator,C++,Typecast Operator,我有一个派生类,它是围绕基类的一个非常薄的包装。基本上,我有一个类,它有两种方式可以比较,这取决于你如何解释它,所以我创建了一个新的类,它从基类派生,只有新的构造函数(只委托给基类)和一个新的操作符==。我想做的是重载派生类中的操作符基&(()),以便在需要将其解释为基的情况下使用 例如: class Base { Base(stuff); Base(const Base& that); bool operator==(Base& rhs); //typical eq

我有一个派生类,它是围绕基类的一个非常薄的包装。基本上,我有一个类,它有两种方式可以比较,这取决于你如何解释它,所以我创建了一个新的类,它从基类派生,只有新的构造函数(只委托给基类)和一个新的
操作符==
。我想做的是重载派生类中的
操作符基&(()
),以便在需要将其解释为基的情况下使用

例如:

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
进行了不区分大小写的比较,但在所有其他情况下,它的行为就像一个字符串。它甚至没有任何新的数据成员,只有一个重载的
操作符==
。(请不要告诉我使用std::string,这只是一个示例!)


我这样做对吗?有些东西似乎有点可疑,但我不能把我的手指放在上面。

因为你的
派生的
是从
Base
公开派生的,所以你的
派生的
已经可以转换为
Base&
。没有必要实施任何额外的措施

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


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

由于您的
派生
公开派生自
Base
,因此您的
派生
已可转换为
Base&
。没有必要实施任何额外的措施

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


我不知道你打算如何使用不同的比较方法来解决原始问题。

因为使用公共继承,C++会自动执行你要实现的转换。没有必要自己做

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


我认为最好是简单地创建一个外部算法。由于缺少虚拟函数,无论如何都不能用基指针/引用替换,因此,与其转换为派生类来强制进行显式比较,不如调用(可能是友元)独立方法来进行不区分大小写的比较。如果你需要在运行时动态地改变它,你甚至可以通过使用算法(使用函数)来实现。

因为使用公共继承,C++会自动执行你要实现的转换。没有必要自己做

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


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

是的,您是对的。真不敢相信我错过了。我一直这样做,但由于某种原因,我今天没有看到。是的,你说得对。真不敢相信我错过了。我一直这样做,由于某种原因,我今天没有看到。我希望在你的实际代码中,你有一个虚拟析构函数。我希望在你的实际代码中,你有一个虚拟析构函数。