2010-05-21 1 views
1

У меня есть производный класс, который является очень тонкой оболочкой вокруг базового класса. В принципе, у меня есть класс, у которого есть два способа сравнить его в зависимости от того, как вы его интерпретируете, поэтому я создал новый класс, который происходит из базового класса и имеет только новые конструкторы (которые просто делегируют базовому классу) и новый operator==. То, что я хотел бы сделать, это перегрузить operator Base&() в классе Derived, поэтому в тех случаях, когда мне нужно интерпретировать его как базу.оператор литья в базовый класс в классе производной тонкой оболочки

Например:

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, но во всех остальных случаях просто вел себя как строка. он даже не имеет новых членов данных, просто перегружен operator==. (Пожалуйста, не говорите мне использовать std :: string, это просто пример!)

Я иду об этом праве? Что-то кажется подозрительным, но я не могу на него наложить.

+0

Я надеюсь, что в вашем фактическом коде у вас есть виртуальный деструктор. –

ответ

2

С вашего Derived является производным от Base Публично, ваш Derived уже переведен на работу Base &. Не нужно ничего реализовывать.

Кроме того, когда дело доходит до оператора преобразования, независимо от того, делаете вы это правильно или неправильно, спорный вопрос, так как ваш оператор преобразования никогда не будет использоваться в любом случае. Преобразование с производной базой всегда обрабатывается встроенными средствами. Если вы предоставите свой собственный оператор для преобразования (как вы это делаете выше), он все равно будет проигнорирован.

Я не понимаю, как вы планировали использовать, если решить исходную проблему с помощью разных методов сравнения.

+0

Да, ты прав. Не могу поверить, что я пропустил это. Я делаю это все время и по какой-то причине я этого не видел сегодня. – miked

2

Поскольку вы используете публичное наследование, C++ автоматически выполнит преобразование, которое вы пытаетесь реализовать. Нет необходимости делать это самостоятельно.

Однако я не думаю, что это обязательно полезно использовать наследование. Вы просто используете его здесь без каких-либо виртуальных функций и просто для того, чтобы эффективно составить дочерний класс. В целом выведите классы для изменения поведения, а не для повторного использования.

Лучше, я думаю, было бы просто создать внешний алгоритм. Из-за отсутствия виртуальных функций вы все равно не можете заменить базовым указателем/ссылкой, поэтому вместо преобразования в производный класс для принудительного явного сравнения просто позвоните автономному методу (возможно, другу), чтобы сделать нечувствительное к регистру сравнение. Вы даже можете пройти алгоритм вокруг (используя функтор), если вам нужно динамически изменять его во время выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^