Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> virtual function, почему не делать всегда  
:(
    Опции темы
sergioK1
Дата 12.7.2013, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Собвенно когда вышла жава все были довольны тем что все функции виртуальны ,
тем более что тормоза по этой причине за которые многие ругали OOP полный миф ,
Ну язык он есть такой , ну покему когда сам разрабатывешь не сделать virtual ? 
захотят перегрузить перегрузят , не захотят - ничего не случиться, 

P.S. в С# такая же фича , разрабатывать не возможно  smile 
PM MAIL   Вверх
mes
Дата 12.7.2013, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



sergioK1, а С++ тут при чем ? smile  smile 


--------------------
PM MAIL WWW   Вверх
sergioK1
Дата 12.7.2013, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(mes @ 12.7.2013,  19:45)
sergioK1, а С++ тут при чем ? smile  smile

При том читать надо что пишут  smile 
На С++  разрабатывать тяжело без возможности наследовать  почему не облегчить жизнь, тупо  smile прописав virtual везде, рапить можно но это 1/2 решение контейнер  не примет ,
Если второй раз не понял - меняй профессию  smile  smile 




PM MAIL   Вверх
mes
Дата 12.7.2013, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(sergioK1 @  12.7.2013,  20:53 Найти цитируемый пост)
На С++  разрабатывать тяжело без возможности наследовать  почему не облегчить жизнь, тупо

а зачем делать тупо, когда для тех, кому нехватает прелестей явы, могу спокойно перейти на ява  ?

С++ предоставляет гораздо больше возможностей, часть из которых Вы хотите легким движением руки отсечь, только потому, что лень виртуал написать, когда это нужно.. У С++ другие цели и другая идеология...





--------------------
PM MAIL WWW   Вверх
sergioK1
Дата 12.7.2013, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(mes @ 12.7.2013,  22:02)
Цитата(sergioK1 @  12.7.2013,  20:53 Найти цитируемый пост)
На С++  разрабатывать тяжело без возможности наследовать  почему не облегчить жизнь, тупо

а зачем делать тупо, когда для тех, кому нехватает прелестей явы, могу спокойно перейти на ява  ?

С++ предоставляет гораздо больше возможностей, часть из которых Вы хотите легким движением руки отсечь, только потому, что лень виртуал написать, когда это нужно.. У С++ другие цели и другая идеология...


Код

 class  Reader{
  
 public :
  AnyClass getData(){
     ......
.........
}

}



Что отсечь?  наооборот добавить для удобства,
Ясно что getData может быть изменен так чего не поставить virtual ?  
Не та идеология в чем ?  
PM MAIL   Вверх
feodorv
Дата 13.7.2013, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Помню, в начале-середине 90-х был такой борландовский продукт - TurboVision. Мне понадобилось-то внести небольшие изменения в оболочку одной программы, основанной на этом самом TurboVision. Ха. Нужные методы не были объявлены virtual. Хорошо, что Борланд дал исходные коды TurboVision. Перекомпиляция всего TurboVision на новейшей скоростной 386 системе занимала 4 часа. Путём оптимизации заголовков удалось снизить это время до получаса. Потом ещё несколько раз я вставлял virtual в нужные мне места. И если бы изначально все методы были бы виртуальными, то вся эта дурацкая деятельность была бы не нужна. Поэтому считаю вопрос правомерным.

С другой стороны, так изначально был построен C++. Ну вот именно так и никак иначе. Решение о том, будет какой-либо метод виртуальным, принимается разработчиком исходя из логики проектирования классов. Посмотрите на MFC - большинство методов виртуальные. Но не все! В java я тоже могу понатыкать final где не попадя, осложнив жизнь другим программистам. Шучу))) Поэтому вопрос "когда сам разрабатываешь, не сделать virtual" теряет свою правомерность и отправляется целиком к разработчику конкретного продукта...


Цитата(sergioK1 @  12.7.2013,  20:55 Найти цитируемый пост)
захотят перегрузить перегрузят , не захотят - ничего не случиться

Вот, кстати, не факт.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
sergioK1
Дата 13.7.2013, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 13.7.2013,  06:57)
Помню, в начале-середине 90-х был такой борландовский продукт - TurboVision. Мне понадобилось-то внести небольшие изменения в оболочку одной программы, основанной на этом самом TurboVision. Ха. Нужные методы не были объявлены virtual. Хорошо, что Борланд дал исходные коды TurboVision. Перекомпиляция всего TurboVision на новейшей скоростной 386 системе занимала 4 часа. Путём оптимизации заголовков удалось снизить это время до получаса. Потом ещё несколько раз я вставлял virtual в нужные мне места. И если бы изначально все методы были бы виртуальными, то вся эта дурацкая деятельность была бы не нужна. Поэтому считаю вопрос правомерным.

С другой стороны, так изначально был построен C++. Ну вот именно так и никак иначе. Решение о том, будет какой-либо метод виртуальным, принимается разработчиком исходя из логики проектирования классов. Посмотрите на MFC - большинство методов виртуальные. Но не все! В java я тоже могу понатыкать final где не попадя, осложнив жизнь другим программистам. Шучу))) Поэтому вопрос "когда сам разрабатываешь, не сделать virtual" теряет свою правомерность и отправляется целиком к разработчику конкретного продукта...


Цитата(sergioK1 @  12.7.2013,  20:55 Найти цитируемый пост)
захотят перегрузить перегрузят , не захотят - ничего не случиться

Вот, кстати, не факт.

В MFC да , 
В яве ставят final когда осознанно  хотят закрыть наследование осознанно, 
в С++ какие соображения? тот же  буст хоть и студенты писали (хоть и Беркли) ну не могли же они не понимать необходимости в возможной перегрузке например  stack  reserve ,

PM MAIL   Вверх
mes
Дата 13.7.2013, 09:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(feodorv @  13.7.2013,  06:57 Найти цитируемый пост)
 И если бы изначально все методы были бы виртуальными, то вся эта дурацкая деятельность была бы не нужна. Поэтому считаю вопрос правомерным.

1. если  автоматом у каждого класса будет  таблица виртуальных методов, то о метапрограммированнии можно будет забыть.. 
2. в моей практиктике витуальная функция одна на сто или более невиртуальных... а в некоторых случаях меня не устраивает родная виртуальность, и я пишу свою..  тоже забыть ??
3. в С++ структура и класс ничем по сути не отличаются...  В блоки данных тоже помещать таблицу ? 
4. Зачастую интерфейс про функцию намного более приемлим, чем интерфейс про класс.. И зачем тогда классовая виртуальность  ? 
5. ну про конструктор умолчим...
и многое многое другое... сейчас лень напрягаться и вспоминать... 

Цитата(sergioK1 @  13.7.2013,  07:48 Найти цитируемый пост)
в С++ какие соображения? тот же  буст хоть и студенты писали (хоть и Беркли) ну не могли же они не понимать необходимости в возможной перегрузке 

перегрузку(overload) с переопределением(override) не путатете ?  что ж тогда на виртуальность то замахнулись ? 
нужна виртуальность во всем берите другие языки, в которых еще и рефлексия к тому же есть.. Нужен еще С++ - используйте связку.. Не надо все разнообразие задач сводить под студенческие требования... 



--------------------
PM MAIL WWW   Вверх
sergioK1
Дата 13.7.2013, 18:12 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(mes @ 13.7.2013,  08:33)
Цитата(feodorv @  13.7.2013,  06:57 Найти цитируемый пост)
 И если бы изначально все методы были бы виртуальными, то вся эта дурацкая деятельность была бы не нужна. Поэтому считаю вопрос правомерным.

1. если  автоматом у каждого класса будет  таблица виртуальных методов, то о метапрограммированнии можно будет забыть.. 
2. в моей практиктике витуальная функция одна на сто или более невиртуальных... а в некоторых случаях меня не устраивает родная виртуальность, и я пишу свою..  тоже забыть ??
3. в С++ структура и класс ничем по сути не отличаются...  В блоки данных тоже помещать таблицу ? 
4. Зачастую интерфейс про функцию намного более приемлим, чем интерфейс про класс.. И зачем тогда классовая виртуальность  ? 
5. ну про конструктор умолчим...
и многое многое другое... сейчас лень напрягаться и вспоминать... 

Цитата(sergioK1 @  13.7.2013,  07:48 Найти цитируемый пост)
в С++ какие соображения? тот же  буст хоть и студенты писали (хоть и Беркли) ну не могли же они не понимать необходимости в возможной перегрузке 

перегрузку(overload) с переопределением(override) не путатете ?  что ж тогда на виртуальность то замахнулись ? 
нужна виртуальность во всем берите другие языки, в которых еще и рефлексия к тому же есть.. Нужен еще С++ - используйте связку.. Не надо все разнообразие задач сводить под студенческие требования...

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

Если честно Я ваших аргуметов ничего не понял , ни про  метопрограмирования  ни про class vs structure .
 в других языках это нормально, в С++ нет какая разница,  ?  По проще можно .



PM MAIL   Вверх
mes
Дата 13.7.2013, 22:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(sergioK1 @  13.7.2013,  17:12 Найти цитируемый пост)
перегрузка это когда есть функция а наследник имет свою реализацию ,
хотите пусть будет переопределение,

перегрузка это наличие двух (или более) функций, различаемых типом вызова.. а переопределение, это изменение поведения одной и той же.. 


Цитата(sergioK1 @  13.7.2013,  17:12 Найти цитируемый пост)
в других языках это нормально, в С++ нет какая разница

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

Да С++ не лишен недостатков, и много где он бессилен.. Но на то и разнообразие языков, чтоб для каждой задачи выбирать подходящий...



--------------------
PM MAIL WWW   Вверх
volatile
Дата 13.7.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  12.7.2013,  19:55 Найти цитируемый пост)
ну покему когда сам разрабатывешь не сделать virtual ? 

Делайте. Вам что, кто-то здесь запрещает?

sergioK1, Какова цель вашего выступления? Что вы предлагаете?


PM MAIL   Вверх
mes
Дата 13.7.2013, 22:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



P.S. я не против внедрения механизмом, испробованных одним языком в другой.. я против привведения С++ в только-студенто-ориентированный язык... 
вначале посмотрите сколько людей, которые вообще не нужна виртуальность... и за что им будут связывать руки ?!
мало того, что цена вызова дорогая, к тому же лишний размер.. но это мелочи, хоть за нич тоже надо платить..
но вот к примеру, как мне в случае маниакальной виртуальности, получить структуру совместимую с С ?  заводить новый тип для обычных структур ? а зачем ?


--------------------
PM MAIL WWW   Вверх
sergioK1
Дата 14.7.2013, 06:48 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 13.7.2013,  21:40)

sergioK1, Какова цель вашего выступления? Что вы предлагаете?

Я предлагаю строить грамотный дизайн даже если это  на С++ smile 
И там где есть бизнес обьект он может быть перегружен наследником ,


И еще чтобы mes внятно и по русски  разьяснил третьей попытки ,  что он имеет ввиду  smile ,
 желательно простыми примерами,
вызов виртуал функции дороже чем обычной - чушь  smile 
Даже обсуждать лень,
PM MAIL   Вверх
mes
Дата 14.7.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(sergioK1 @  14.7.2013,  05:48 Найти цитируемый пост)
вызов виртуал функции дороже чем обычной - чушь   
Даже обсуждать лень,

скажите это микроконролерщикам.. которым даже обычный вызов бывает дорог.. 



Цитата(sergioK1 @  14.7.2013,  05:48 Найти цитируемый пост)
И еще чтобы mes внятно и по русски  разьяснил третьей попытки ,  что он имеет ввиду   ,
 желательно простыми примерами,


Цитата(sergioK1 @  14.7.2013,  05:48 Найти цитируемый пост)
Я предлагаю строить грамотный дизайн даже если это  на С++  

так я двумя руками за граммотный.. только я против считать явскую корявость граммотным дизайном..  Пусть на ней студенты развлекаются... 


http://codepad.org/kGYnfiS8
Код

#include <iostream>

#define V

struct proxy
{
  V bool is_special1() const { return _ch == 255; }
  V bool is_special2() const { return _ch == 254; }
  V bool is_null() const { return _ch == 0;  }

private:
  unsigned char _ch;

};

std::ostream& operator <<(std::ostream& os, proxy const& ch)
{
 os
 << (ch.is_special1() ? "special1" : 
     ch.is_special2() ? "special2" :
     ch.is_null() ? "null" : "other");

 return os;
}

unsigned char data[] = { 10,255,30,23,254,0,40 };
const size_t data_size = sizeof(data)/sizeof(*data);

int main()
{
  for(size_t i=0; i<data_size; ++i)
    std::cout << int(data[i]) << " is " << (*reinterpret_cast<proxy*>(data+i)) << std::endl;

}

теперь попробуйте повторить с #define V virtual.. 


--------------------
PM MAIL WWW   Вверх
volatile
Дата 14.7.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  14.7.2013,  06:48 Найти цитируемый пост)
вызов виртуал функции дороже чем обычной - чушь   
Даже обсуждать лень, 

Этот вопрос (слава богу!) не нужно обсуждать. Достаточно просто измерить:
Код

Times for:
virtual function = 70.0,  plain function = 10.0
virtual function = 80.0,  plain function = 10.0
virtual function = 90.0,  plain function = 10.0

http://codepad.org/J9Vb0nl9
На домашней машине, при полной оптимизации, виртуальная функция в среднем в 5 раз медленее чем простая.


Это сообщение отредактировал(а) volatile - 14.7.2013, 10:59
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.