代码之家  ›  专栏  ›  技术社区  ›  miked

将运算符强制转换为薄包装派生类中的基类

  •  1
  • miked  · 技术社区  · 16 年前

    我有一个派生类,它是一个围绕基类的非常薄的包装器。基本上,我有一个类,它有两种方法可以比较,这取决于你如何解释它,所以我创建了一个新的类,它派生自基类,并且只有新的构造函数(只委托给基类)和一个新的 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 是典型的逐字符比较。但是我创建了一个新班级 CaseInsensitiveString 做了一个不区分大小写的比较 CaseInsensitiveString==CaseInsensitiveString 但在所有其他情况下,其行为就像一个字符串。它甚至没有任何新的数据成员,只是超载了 运算符== . (请不要告诉我使用std::string,这只是一个例子!)

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   AnT stands with Russia    16 年前

    自从你 Derived 来源于 Base 公开地说,你的 衍生的 已转换为 Base & . 不需要执行任何额外的操作。

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

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

        2
  •  2
  •   Mark B    16 年前

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

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

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

    推荐文章