我有一个派生类,它是一个围绕基类的非常薄的包装器。基本上,我有一个类有两种方式可以比较,这取决于你如何解释它,所以我创建了一个派生自基类的新类,只有新的构造函数(只是委托给基类)和一个新的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,这只是一个例子!)
我这样做了吗?有些东西看似腥,但我不能把手指放在上面。
答案 0 :(得分:2)
由于您的Derived
来自Base
公开,Derived
已经可以转换为Base &
。没有必要再实施任何东西了。
此外,当谈到转换运算符本身时,无论你是对还是错,都是一个没有实际意义的问题,因为你的转换运算符永远不会被使用。派生到基础的转换总是由内置的方法处理。如果您提供自己的转换操作符(如上所述),则无论如何都会被忽略。
我不知道你打算如何使用不同的比较方法来解决原始问题。
答案 1 :(得分:2)
由于您使用公共继承,C ++将自动执行您尝试实现的转换。没有必要自己动手。
但是我认为这不一定是继承的好用。你只是在这里使用它而没有任何虚函数,只是为了有效地组成子类。通常派生类来改变行为,而不是重用它。
我认为最好只创建一个外部算法。由于缺少虚函数,无论如何都无法用基指针/引用替换,因此不要转换为派生类来强制显式比较,只需调用(可能是朋友)独立方法来进行不区分大小写的比较。如果需要在运行时动态更改算法,您甚至可以传递算法(使用仿函数)。