将操作符强制转换为瘦包装器派生类中的基类

时间:2010-05-21 17:25:37

标签: c++ typecast-operator

我有一个派生类,它是一个围绕基类的非常薄的包装器。基本上,我有一个类有两种方式可以比较,这取决于你如何解释它,所以我创建了一个派生自基类的新类,只有新的构造函数(只是委托给基类)和一个新的operator==。我想要做的是重载Derived类中的operator Base&(),以便我需要将其解释为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上进行了不区分大小写的比较,但在所有其他情况下,它只是表现得像String一样。它甚至没有任何新的数据成员,只是一个过载的operator==。 (请不要告诉我使用std :: string,这只是一个例子!)

我这样做了吗?有些东西看似腥,但我不能把手指放在上面。

2 个答案:

答案 0 :(得分:2)

由于您的Derived来自Base公开,Derived已经可以转换为Base &。没有必要再实施任何东西了。

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

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

答案 1 :(得分:2)

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

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

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