Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 15:06   #1
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию перегрузка new

Вопрос: почему new не может быть виртуальным или даже абстрактным, так чтоб его наследовать?
В целом, конечно, я догадываюсь, что он статический, но все таки, можно ли что-то придумать?
Писать одно и тоже в каждом наследнике - лень.

Последний раз редактировалось f.hump; 10.04.2013 в 15:11.
f.hump вне форума Ответить с цитированием
Старый 10.04.2013, 15:25   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Вопрос: почему new не может быть виртуальным или даже абстрактным, так чтоб его наследовать?
в целом, конечно, я догадываюсь, что он статический, но все таки, можно ли что-то придумать?
Писать одно и тоже в каждом наследнике лень
Переопределение operator new достаточно ответственная операция.И поэтому, есть смысл инкапсулировать её где-то в одном месте.Что бы упростить контроль за операцией выделения памяти:

Код:
struct IFace
{
   ~IFace(){}
   IFace* Clone()const=0;
   //вот здесь можно переопределить оператор new
   template<class T> T* New_Operation(const T& src){return new T(src);}
   template<class T> T* New_Operation(){ return new T(); }
};

struct Derrived1: IFase
{
   IFace* Clone()const { return New_Operation<Derrived1>(); }
};
struct Derrived2: IFase
{
   IFace* Clone()const { return New_Operation<Derrived2>(); }
};
Потомки реализуют только метод Clone, а точка контроля за памятью - в классе IFase
_Bers вне форума Ответить с цитированием
Старый 10.04.2013, 15:40   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а я вот проблемы не понял, new же наследуется помоему.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2013, 15:48   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

держать в одном месте - это, да.

только, если я правильно понимаю, в предложенной записи New_Operation не будет вызывать new, написанный для IFace, он будет вызывать new<T>. Собственно это и есть проблема - лень писать new<T> для каждого Т.




так или иначе, прийдется просто проверить. может просто туплю по теме наследования new.

Последний раз редактировалось f.hump; 10.04.2013 в 15:54.
f.hump вне форума Ответить с цитированием
Старый 10.04.2013, 16:02   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Как раз если будет абстрактным, тогда придется в каждом наследнике определять new. Далее, new не может быть виртуалным ибо есть статический член класса.

Унаследуйте все ваши T от одного родителя и переопределите new в этом родителе. Либо просто переопределите new глобальное.

В чем собственно проблема?
waleri на форуме Ответить с цитированием
Старый 10.04.2013, 17:20   #6
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Вопрос: почему new не может быть виртуальным или даже абстрактным, так чтоб его наследовать?
В целом, конечно, я догадываюсь, что он статический, но все таки, можно ли что-то придумать?
Писать одно и тоже в каждом наследнике - лень.
А он наследуется, все норм. Кстати несмотря на то, что он статический, его поведение в принципе вполне себе виртуально, если разработчик знает, как работает виртуальный деструктор.
still_alive вне форума Ответить с цитированием
Старый 10.04.2013, 17:23   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
В чем собственно проблема?
видимо туплю.
думал про new, как про некий особый метод.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка << и >> Arrioh Помощь студентам 2 02.11.2012 23:54
Перегрузка Shandr71 Общие вопросы C/C++ 5 15.12.2011 22:16
перегрузка [] monolit111 Общие вопросы C/C++ 2 10.12.2011 20:25
Перегрузка в С++ anna01 Общие вопросы C/C++ 2 23.11.2010 22:21
перегрузка DRELORD Помощь студентам 1 22.04.2010 09:54