Безопасно переопределите виртуальные функции C++

Простое и быстрое решение этой проблемы с использованием наследования прототипа:

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

Пример / Использование

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

Обновление: больше не изменяет исходный массив.

98
задан sth 30 January 2009 в 23:08
поделиться

6 ответов

Насколько я знаю, Вы не можете только сделать это кратким обзором?

class parent {
public:
  virtual void handle_event(int something) const = 0 {
    // boring default code
  }
};

я думал, что читал на www.parashift.com, что можно на самом деле реализовать абстрактный метод. Который имеет смысл мне лично, единственная вещь, которую он делает, вынудить подклассы реализовать его, никто ничего не сказал об этом не позволяемый иметь саму реализацию.

17
ответ дан Ray Hidayat 5 November 2019 в 12:20
поделиться

Что-то как C# override ключевое слово не является частью C++.

В gcc, -Woverloaded-virtual предостерегает от сокрытия виртуальной функции базового класса с функцией того же имени, но достаточно другая подпись, что это не переопределяет его. Это, тем не менее, не защитит Вас от отказа переопределить функцию из-за самой опечатки в названии функции.

20
ответ дан CB Bailey 5 November 2019 в 12:20
поделиться

В MSVC можно использовать ключевое слово CLR override, даже если Вы не компилируете для CLR.

В g ++, нет никакого прямого способа осуществить это во всех случаях; другие люди дали хорошие ответы о том, как поймать различия в подписи с помощью -Woverloaded-virtual. В будущей версии кто-то мог бы добавить синтаксис как __attribute__ ((override)) или эквивалентное использование C++ 0x синтаксис.

11
ответ дан Doug 5 November 2019 в 12:20
поделиться

Я предложил бы небольшое изменение в Вашей логике. Это может или не может работать, в зависимости от того, что необходимо выполнить.

handle_event () может все еще сделать "скучный код по умолчанию", но вместо того, чтобы быть виртуальным, в точке, где Вы хотите, чтобы это сделало, "новый захватывающий код" имеет вызов базового класса абстрактный метод (т.е. must-be-overridden) метод, который будет предоставлен Вашим классом-потомком.

РЕДАКТИРОВАНИЕ: И если Вы позже решаете, что некоторые Ваши классы-потомки делают не потребность предоставить "новый захватывающий код", затем можно изменить краткий обзор на виртуальный и предоставить пустую реализацию базового класса той "вставленной" функциональности.

3
ответ дан JMD 5 November 2019 в 12:20
поделиться

Сделайте функциональный краткий обзор, так, чтобы производные классы не имели никакого другого выбора, чем переопределить его.

@Ray Ваш код недопустим.

class parent {
public:
  virtual void handle_event(int something) const = 0 {
    // boring default code
  }
};

Абстрактные функции не могут иметь тел, определенных встроенный. Это должно быть изменено для становления

class parent {
public:
  virtual void handle_event(int something) const = 0;
};

void parent::handle_event( int something ) { /* do w/e you want here. */ }
5
ответ дан Tanveer Badar 5 November 2019 в 12:20
поделиться

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

, Например, это предупреждает C4263 в Microsoft Visual C++.

2
ответ дан Mark Ransom 5 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: