• @!!ex © (17.07.08 17:44) [0]
    Есть виртуальны метод Method(bool NeedParent) в базовом классе BaseClass.
    Есть наследник, перекрывающий виртуальный метод NewClass.

    Не понимаю как сделать следующее:
    Вызвать NewClass->Method.
    который бы в зависимости от параметра NeedParent, либо обрабатывался бы в новом методе, либо вызывался метод предка.
    Как в дельфи я знаю... inherited рулит... а как в С++???
  • rule © (17.07.08 17:54) [1]
    Parent::Method();
  • @!!ex © (17.07.08 17:54) [2]
    я так и думал. :(
  • rule © (17.07.08 17:55) [3]
    а что помешало проверить ??? :-)
  • @!!ex © (17.07.08 17:57) [4]
    Да я уж напроверялся, потом переписывать все. :)))
    А в деструкторе NewClass нужно вызывать деструктор предка??
  • wicked © (17.07.08 18:02) [5]

    > А в деструкторе NewClass нужно вызывать деструктор предка?
    > ?

    нет
  • @!!ex © (17.07.08 18:03) [6]
    > [5] wicked ©   (17.07.08 18:02)

    а почему?
  • Alkid (17.07.08 18:11) [7]

    > а почему?

    Вызывается автоматически. Почти так же обстоит дело с конструкторами.
  • rule © (17.07.08 18:21) [8]

    > @!!ex ©

    Спроси у Страуструпа :-) он очень сильно старался и писал очень хорошую книгу, чтоб рассказать что и как нада делать с придуманным им языком :-)
  • @!!ex © (17.07.08 18:29) [9]
    > [8] rule ©   (17.07.08 18:21)

    Я читал.... видимо невнимательно...
  • Mystic © (17.07.08 18:39) [10]
    > а почему?

    Если вкратце, то так велит Великий Стандарт Языка
  • Mystic © (17.07.08 18:43) [11]
    > Я читал.... видимо невнимательно...

    Страуструпа надо раз пять прочесть. Такой уж язык он придумал.
  • ketmar © (17.07.08 21:31) [12]
    >[11] Mystic © (2008-07-17 18:43:00)
    >Страуструпа надо раз пять прочесть. Такой уж язык он придумал.

    и всё равно не поможет. потому что язык был придуман для просчёта синтеза психотропных веществ, который страус задолбался считать на листочках.

    ---
    All Your Base Are Belong to Us
  • Alkid (17.07.08 23:20) [13]

    > >[11] Mystic © (2008-07-17 18:43:00)
    > >Страуструпа надо раз пять прочесть. Такой уж язык он придумал.
    >
    > и всё равно не поможет. потому что язык был придуман для
    > просчёта синтеза психотропных веществ, который страус задолбался
    > считать на листочках.

    Ну вообще-то над ним начали работать, что бы писать на нем симулятор сети.
  • ketmar © (17.07.08 23:22) [14]
    >[13] Alkid (2008-07-17 23:20:00)
    насколько я помню, страус что-то считал на симуле, кажется (или на чём-то подобном). а оно было жутко медленным. страус решил взять быстрый C и испортить в меру своей тупости.

    ---
    Do what thou wilt shall be the whole of the Law.
  • Игорь Шевченко © (17.07.08 23:43) [15]
    ketmar ©   (17.07.08 23:22) [14]

    Чтоб тебе быть хоть на тысячную долю таким тупым, как Страуструп...
  • Alkid (18.07.08 10:11) [16]

    > ketmar ©   (17.07.08 21:31) [12]
    > и всё равно не поможет. потому что язык был придуман для
    > просчёта синтеза психотропных веществ, который страус задолбался
    > считать на листочках.


    > насколько я помню, страус что-то считал на симуле, кажется
    > (или на чём-то подобном). а оно было жутко медленным. страус
    > решил взять быстрый C и испортить в меру своей тупости.


    У тебя какие-то комплексы по отношению к Страуструпу?
    :)
  • rule © (18.07.08 10:55) [17]
    Вот помоему С++ как раз самый живучий язык пока на планете. И наследники (Джава там, ПХП, Рубби ...) они все то взяли очень многие идеи именно от С++, и не важно что страуструм сам опирался на существующую модулу, важно что было потом и что есть сейчас. С++ жил, жив и будет жить. :-) Так что я думаю Страуструп очень даже клевый чувак ... может он гей, может он фашист, я не знаю, но то что он не тупой, в этом я точно уверен.

    И книга у него написана очень даже доступно и разжевано. То что там очень много информации, и тяжелой для восприятия за один раз.
  • Mystic © (18.07.08 12:02) [18]
    > Вот помоему С++ как раз самый живучий язык пока на планете.
    >  И наследники (Джава там, ПХП, Рубби ...) они все то взяли
    > очень многие идеи именно от С++


    Про руби не скажу, но Java и PHP имеют C-подобный синтаксис. Большая часть идей С++ так и осталась в C++ :) А популярность C++ во многом следствие совместимости с языком C.
  • Alkid (18.07.08 12:23) [19]

    > Большая часть идей С++ так и осталась в C++ :)

    Крайне спорное утверждение.


    > А популярность C++ во многом следствие совместимости с языком
    > C.

    Уточню - старт популярности произошёл именно по этой причине.
  • Mystic © (18.07.08 13:21) [20]
    > Крайне спорное утверждение.

    Хорошо, давай конкретно перечислять. На основании моих знаний:

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

    Перегрузка операторов. Приоритета C++ в этом нету, перегрузка операторов была еще в Algol. Prolog предоставляет более гибкие механизмы перегрузки: для каждого оператора задается лексема, инфиксность и приоритет. Перегрузка функций в C++ имеет ту характерную особенность, что она привязана к наиболее эффективному способу генерации кода для целевой машины. Эта идея не получила дальнейшего своего распространения. Перегрузка операций в C# ближе все-же к Ada.    

    Реализация объектов. C++ один из немногих языков (других я не знаю), где объекты могут создаваться как в стеке, так и в куче. Конечно, стандарт не уделяет внимания вопросам реализации, но описано это так, что наиболее простой и понятный способ реализации есть помещение объектов в стек. Сделано опять же из-за соображений производительности. Мне неизвестны другие языки, в которых был предпринят такой подход (кроме может быть object в паскаль).

    Система приведений типов объектов. В C++ она очень богатая, но большого развития не получила. Сюда же можно добавить static_cast, reinterpret_cast, ... которые также есть только в C++.

    Множественное наследование. Встречается только в скриптовых языках, да и там оно совсем-совсем другое.

    Шаблоны. Частично взяты с Ada, так что концепция не нова. Предоставляют новые возможности метапрограммирования, которое также не получило распространения в наследниках. Подобная возможность (и только она) изначально присутсвует в функциональных языках, поэтому говорить о том, что ФЯ взяли ее с С++, имхо, некорректно.

    Константность. Та часть, что используется только для параметров функций, давно была в Ada (in, out, access). А вот константные объекты, mutable и прочее, константные методы я особо в других языках не замечал.

    Модификаторы области видимости. Опять же в точности такой же системы, как в C++, я не встречал. public, private, protected остались. private наследование не знаю. В C++ модификатор доступа может быть только усилен (public => protected => private). Опять же private наследование... Все это специфично для C++. А сама идея разденения на private/protected/public кажется настолько естественным, что вероятнее всего было до C++ (надо смотреть в сторону Modula).

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

    В сумме я вижу не так уж и много...
  • Alkid (18.07.08 14:49) [21]

    > Хорошо, давай конкретно перечислять. На основании моих знаний:

    Что же, наверное в итоге соглашусь с такой постановкой вопроса.


    > Перегрузка операций в C# ближе все-же к Ada.    

    Можно поподробнее об этом? Просто я пока не вижу *существенных* различий между перегрузкой операторов в C++ и в С#.


    > Мне неизвестны другие языки, в которых был предпринят такой
    > подход

    В C# можно value-типы (структуры) на стеке создавать.
    Кстати, возможность делать автоматические объекты пользовательских типов в С++ является (для меня) одной из самых привлекательных возможностей, ибо позволяет применять многие хорошие техники программирования.


    > А сама идея разденения на private/protected/public кажется
    > настолько естественным, что вероятнее всего было до C++
    > (надо смотреть в сторону Modula).

    C++ пропионерил концепцию protected-членов класса.

    В остальном соглашусь.
  • Mystic © (18.07.08 15:43) [22]

    > Можно поподробнее об этом? Просто я пока не вижу *существенных*
    > различий между перегрузкой операторов в C++ и в С#.


    Вот страничка описания стандарта Ada'83
    http://archive.adaic.com/standards/83lrm/html/lrm-06-07.html

    По стандарту Ады переименовывать нельзя присваивание, точку, возможно другие операторы, которые имеют специальное назначение. C++ пошел в этом пути дальше, там переименовывать можно если не все, то многое, что иногда дает весьма забавные эффекты. С# же в этом вопросе откатился на позиции Ada: нельзя перегружать =, ., ?:, ->, new, is, sizeof, typeof. Зачастую стандарт C++ описывает подробно смысл, в котором перегружается оператор. Более того, соглашения по поводу перегрузки операций ++ и -- в языке C# в общем случае менее эффективны, чем те, которые в C++. Но более человечны, что-ли... Скажем, уже без разницы, как писать цикл:

    for(SomeTime i = startValue; i < lastValue; ++i)
    или
    for(SomeTime i = startValue; i < lastValue; i++)

    А вот знакомство с особенностями C++ приучило меня к первому варианту.


    > В C# можно value-типы (структуры) на стеке создавать.
    > Кстати, возможность делать автоматические объекты пользовательских
    > типов в С++ является (для меня) одной из самых привлекательных
    > возможностей, ибо позволяет применять многие хорошие техники
    > программирования.


    value типы можно и в куче хранить (boxing-unboxing), но все-же как для меня это совсем немного другая концепция. Конечно, в том что реализовано в C++ есть свои привлекательные черты. Например, создавая переменные в стеке мы не мусорим, поэтоому нет острой потребности в сборке мусора. Если добавить weak pointers, то проектировать системы, в которых сборка мусора не требовалась бы, становится не так уж проблемно. Но мы разговариваем о том, что другие языки подхватили.

    > C++ пропионерил концепцию protected-членов класса.

    Да, это оказалось достаточно полезно. Но эту концепцию трудно назвать революционной.
  • passing by (18.07.08 16:04) [23]
    >> А в деструкторе NewClass нужно вызывать деструктор предка?
    >> Вызывается автоматически.

    покури на всякий случай виртуальные деструкторы
  • wl © (18.07.08 16:43) [24]

    > passing by   (18.07.08 16:04) [23]

    причем тут?
    что, по твоему выведется на экран в таком коде:

    #include <iostream>
    class a
    {
    public:
    ~a() { std::cout << "~a "; }

    };
    class b: a
    {
    public:
    ~b() { std::cout << "~b "; }

    };
    int main()
    {
    b _b;
    }


  • Alkid (18.07.08 17:00) [25]

    > wl ©   (18.07.08 16:43) [24]

    Будет
    ~b~a

    Гораздо интереснее, что будет, если b от a унаследуется публично, а main() будет иметь вид:

    int main()
    {
     std::auto_ptr<a> b(new b());
    }

  • Alkid © (18.07.08 17:00) [26]

    >  std::auto_ptr<a> b(new b());
    > }

    Идентификатор поинтера - _b, описался :)
  • wl © (18.07.08 17:08) [27]
    ну тут удаление через базовый класс, нужна виртуальность деструктора конечно же. Собственно в этом его и задача насколько я понимаю
  • GrayFace © (18.07.08 20:05) [28]
    rule ©   (18.07.08 10:55) [17]
    Так что я думаю Страуструп очень даже клевый чувак ... может он гей, может он фашист, я не знаю, но то что он не тупой, в этом я точно уверен.

    Вот так и знал, что С++ придумал гей-фашист! :)
  • ketmar © (18.07.08 22:00) [29]
    >[15] Игорь Шевченко © (2008-07-17 23:43:00)
    >Чтоб тебе быть хоть на тысячную долю таким тупым, как Страуструп…

    тогда меня запрут в палату с мягкими стенами.

    >[16] Alkid (2008-07-18 10:11:00)
    >У тебя какие-то комплексы по отношению к Страуструпу?

    мне-то что, я не вынужден пользоваться его бредом.

    >[17] rule © (2008-07-18 10:55:00)
    >И наследники (Джава там, ПХП, Рубби …) они все то взяли очень многие идеи именно
    >от С++

    бугога. жги ещё.

    >И книга у него написана очень даже доступно и разжевано. То что там очень много
    >информации, и тяжелой для восприятия за один раз.

    язык Lua в одном файле на 300 кил сочетает документацию по языку, стандартным библиотекам и C API. этого достаточно, чтобы не только выучить, но и спокойно оный язык использовать. при этом в языке есть средства для создания классов, исключений, перегрузки операторов и ещё куча вкусностей.

    язык Objective C отличается от C фактически одной добавленой конструкцией. для её понимания достаточно пары страниц текста и нескольких примеров.

    так что «много тяжелой для восприятия информации» означает лишь, что описывают тяжёлую и неповоротливую дуру. что и не удивительно, если учесть, что у цпп не было даже дизайн-документа.

    ---
    All Your Base Are Belong to Us
  • GrayFace © (19.07.08 00:39) [30]
    ketmar ©   (18.07.08 22:00) [29]
    язык Lua в одном файле на 300 кил сочетает документацию по языку, стандартным библиотекам и C API. этого достаточно, чтобы не только выучить, но и спокойно оный язык использовать. при этом в языке есть средства для создания классов, исключений, перегрузки операторов и ещё куча вкусностей.

    Как я понял, полной справкой по Lua можно считать только книгу "Programming in Lua".
  • ketmar © (19.07.08 13:42) [31]
    >[30] GrayFace © (2008-07-19 00:39:00)
    нет. это как раз набор хитропопых техник. до которых любой может дойти после чтения стандартной документации. всё, что делает PiL — сокращает «время вхождения» для совсем ньюбов.

    лично я учил Lua по мануалу.  и не только я. PiL тогда вообще не было. %-)

    хотя нельзя не признать, что код в книге весьма изящный, и вообще для прочтения использующим Lua всяко рекомендуется. но не обязательно, скорее всего, ничего кроме эстетического удовольствия там не найдётся.

    ---
    Do what thou wilt shall be the whole of the Law.
  • guav © (19.07.08 14:14) [32]
    Так и по С++ не обязательно Страуструпа читать. Вот я не читал, а синтаксис по MSDN освоил, без всяких многократных прочтений. Книги, что я читал по С++, - это всё тоже набор техник, до которых можно и самому дойти.

    > язык Lua в одном файле на 300 кил

    Мне кажется, что ты сравниваешь разные весовые категории. Динамически типизированный скриптоязык, требующий компилятора/интерпретатора на целевой платформе vs портабельный статически типизированный объектно-ориентироавнный ассемблер. Понятно, что второе будет сложнее.
  • ketmar © (19.07.08 15:47) [33]
    >[32] guav © (2008-07-19 14:14:00)
    разница в том, что Lua предоставляет инструменты, а цпп — решения. отсюда цпп уродлив и сложен.

    опять же — сравни цпп и Objective C. я бы не сказал, что Objective C менее выразителен (скорее наоборот), но добились этого намного более изящным методом. потому что сначала думали, а потом делали. страус же — ровно наоборот.

    ---
    All Your Base Are Belong to Us
  • Alkid (19.07.08 17:45) [34]

    > разница в том, что Lua предоставляет инструменты, а цпп
    > — решения. отсюда цпп уродлив и сложен.

    Все языки предоставляют инструменты и ни один - решения.


    > опять же — сравни цпп и Objective C. я бы не сказал, что
    > Objective C менее выразителен (скорее наоборот), но добились
    > этого намного более изящным методом.

    :) Мда. Как будет выглядеть типобезопасный универсальный контейнер на Objective-C? Хотя бы аналог vector`а из STL?


    > потому что сначала думали, а потом делали. страус же — ровно
    > наоборот.

    Сдается мне, что ты именно так письма пишешь. Сначала пишешь, потом думаешь. Это я к чему - на словах опустить можно все что угодно, если не заворачиваться попыткой избрать некую систему объективных критериев и провести честное сравнение. Естественно гораздо проще поступать по принципу -  "мне не нравится => плохое", заменяя предметную аргументацию обидными эпитетами и коверкая имя Страуструпа.

    P.S. Выбор Lua и Objective-C на роль ниспровергателей С++ достаточно неудачен, ибо первый вообще из другой весовой категории, а Objective-C - весьма специфический язык, по сути помесь чистого С (и его недостатков) и Smalltalk. И этот язык даже близко по используемости не добрался до уровня С++.

    P.P.S. А ты часом не линуксоид? :)
Есть новые Нет новых   [134439   +46][b:0][p:0.001]