От новичка до гуру: Курсы программирования на CyberDuff

Как мне реализовать перегрузку оператора в базовом классе для части базового класса объекта производного класса?

Как мне реализовать перегрузку оператора в базовом классе для части базового класса объекта производного класса?

См. этот пример кода и реализуйте часть базового класса для реализации оператора * в объекте производного класса.

class base {
     int x;
public:

};

class der : public base {
    int y;
public:
    const der operator*(const der& rh) {
        der d;
        d.y = y * rh.y;
        return d;
    }

};
c++
19.04.2012

  • @MikeSeymour: Мне кажется, что реализация operator* изменяет только одно значение, d, которое создается внутри функции. Он не изменяет ни аргумент rh, ни *this. 19.04.2012
  • @FrerichRaabe: Вы правы, я неправильно понял; Я просто увидел, что это не const, и приукрасил остальное. Должно быть, слишком рано утром. 19.04.2012
  • const der operator*(const der& rh) {...} следует читать der operator*(const der& rh) const {...}: вы не хотите, чтобы результат был константой, а должен быть объект, над которым вы работаете (*this). 19.04.2012
  • Самый полезный ответ заключается в том, что вы не должны. Дизайн сбивает с толку и подвержен ошибкам. 19.04.2012

Ответы:


1

Реализуйте base::operator *, как показано ниже:

class base {
protected:
  int x;
public:
  base operator * (const base &rh) {
    base b;
    b.x = x * rh.x;
    return b;
  }
};

И назовите это как,

der operator * (const der& rh) {
  der d;
  Base &b = d;  // <---- assign a temporary reference of 'base'
  b = static_cast<Base&>(*this) * rh; // <---- invoke Base::operator *
  d.y = y * rh.y;
  return d;
}
19.04.2012
  • @SteveJessop, я уже изменил свой пост. На самом деле, поскольку была только одна переменная x, у меня возник соблазн дать другое решение, в котором непосредственно производится умножение x на der. Но затем я сделал решение более общим. Пожалуйста, проверьте. 19.04.2012

  • 2
  • Этот подход означает, что * не коммутативно; base() * der() тип проверяет, а der() * base() нет. Кроме того, выполнение base() * der() может привести к неожиданным результатам (поскольку оператор возьмет только часть base объекта der, что может быть, а может и не быть тем, что вам нужно). 19.04.2012
  • @FrerichRaabe Я не могу понять вашу точку зрения, при таком подходе не будет никакой разницы между base() * der() и der()*base(). Что касается неожиданных результатов для base() * der(), я в целом согласен, но это общая проблема. Имеет ли это смысл, определяется семантикой ваших классов, и программисты несут ответственность за управление доступом (через public private и т. д.), чтобы отразить эту семантику. 19.04.2012
  • Спасибо за исправление опечаток, у меня не было под рукой компилятора (сейчас я вынужден использовать Windows). 19.04.2012
  • Разница в том, что base() * der() компилируется, а der() * base() нет, поскольку перегрузка operator* в классе der скрывает operator* в базовом классе. Я удивлен, что это работает для вас, вам нужно using base::operator*; в der, чтобы избежать этого. 19.04.2012
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

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

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..