У меня есть производный класс, который является очень тонкой оболочкой для базового класса. По сути, у меня есть класс, который можно сравнивать двумя способами в зависимости от того, как вы его интерпретируете, поэтому я создал новый класс, производный от базового класса и имеющий только новые конструкторы (которые просто делегируются базовому классу) и новый operator==
. Я хотел бы перегрузить operator Base&()
в классе Derived, поэтому в тех случаях, когда мне нужно интерпретировать его как 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, это всего лишь пример!)
Я пойду об этом, верно? Что-то кажется подозрительным, но я не могу указать на это пальцем.