Объявление

Collapse
No announcement yet.

Вопрос по C++ из онлайн теста

Collapse
X
 
  • Filter
  • Время
  • Show
Clear All
new posts

  • Вопрос по C++ из онлайн теста

    Сижу вот онлайн тест решаю, один вопрос просто упорно не поддается осмыслению

    "Каков порядок вызовов деструкторов для объекта класса Y унаследованного от класса X который имеет объект класса А как data-member класса Y в С++ ?"



    Собственно, больше интересует, как эти объекты относятся друг к другу, чем порядок вызова их деструкторов.
    git blame

  • #2
    Казнить нельзя помиловать? Если прочитать это как

    "Каков порядок вызовов деструкторов для объекта класса Y, унаследованного от класса X, который (класс Y) имеет объект класса А как data-member класса Y (а это выкинуть нафиг) в С++ ?"

    Тогда получается
    class X {};
    class Y: public X { A a; }

    Автора отправить в принудительный неоплачиваемый отпуск - доучиваться в школе
    Strange women lying in ponds distributing swords is no basis for a system of government!

    Comment


    • #3
      Сообщение от palmdev Посмотреть сообщение
      Казнить нельзя помиловать? Если прочитать это как

      "Каков порядок вызовов деструкторов для объекта класса Y, унаследованного от класса X, который (класс Y) имеет объект класса А как data-member класса Y (а это выкинуть нафиг) в С++ ?"

      Тогда получается
      class X {};
      class Y: public X { A a; }

      Автора отправить в принудительный неоплачиваемый отпуск - доучиваться в школе

      В общем то да, вся суть в "который", и наличии запятой.
      Вообще это перевод с английского, где нет запятой и стоит that.
      Согласен, надо доучиваться в школе )) нО по английскому )

      Теперь вот что. Почему не посмотреть на это так:
      Объект класса A находится в базовом классе X?
      Ведь тогда тоже верно: Класс Y также содержит (унаследован, но с точки зрения множеств - содержит) класс X (как базовый), и соответственно, содержит объект А.

      ТАким образом второй вариант:

      class X{A a;};
      class Y: X{};

      Тоже имеет место жить.

      Где я не прав?
      git blame

      Comment


      • #4
        Ты тогда приведи оригинальный текст на английском, а то пока что получается как в анекдоте: "Слышал я твоего Шаляпина, мне Рабинович по телефону напел - ничего особенного."
        Strange women lying in ponds distributing swords is no basis for a system of government!

        Comment


        • #5
          Перевод почти дословный

          Whаt is thе огdег оf dеstгuсtог саlls fог ап оЬjесt оf сlаss У inherited frоm сlаss Х thаt hаs аn oЬjесt оf сlass А аs dаtа mеmЬег оf сlass У in С++?

          Я то, конечно, тоже склоняюсь к первому варианту (Класс У содержит объект класса А), но по логике приведенной мной выше объект А также может быть и внутри Х, хотя этот ответ будет чуть дальше, чем первый, но в принципе, тоже верный.
          git blame

          Comment


          • #6
            Сообщение от xelaz Посмотреть сообщение
            Перевод почти дословный

            Whаt is thе огdег оf dеstгuсtог саlls fог ап оЬjесt оf сlаss У inherited frоm сlаss Х thаt hаs аn oЬjесt оf сlass А аs dаtа mеmЬег оf сlass У in С++?

            Я то, конечно, тоже склоняюсь к первому варианту (Класс У содержит объект класса А), но по логике приведенной мной выше объект А также может быть и внутри Х, хотя этот ответ будет чуть дальше, чем первый, но в принципе, тоже верный.
            херня какая-то.
            как класс X может содержать data member of class Y , если Y inherited from X ?
            у́кшшоул э́йхнуф

            Comment


            • #7
              Сообщение от the_alexx Посмотреть сообщение
              херня какая-то.
              как класс X может содержать data member of class Y , если Y inherited from X ?
              Если data member A принадлежит Y, но не принадлежит X, то никак. (т.е. Y содержит и класс X и data member 'a', и пересечение X и 'a' равно нулю.

              Но data member 'a' может лежать и в пересечении X и Y, и тогда принадлежать обоим классам. Разве не так?

              class X{A a;};
              class Y: X{};

              Здесь 'a' содержится в X, а поскольку весь класс X входит в класс Y, то значит, он содержится и в класссе Y.

              Таким образом, класс X содержит data member класса Y, и при этом Y inherited from X

              Мне вот интересно, в чем я здесь заблуждаюсь ?
              git blame

              Comment


              • #8
                Хотел приколоться, но к сожалению, мой кусок кода не компилируется. Эх, подзабыл уже C++...
                Last edited by palmdev; 14.02.2011, 21:49.
                Strange women lying in ponds distributing swords is no basis for a system of government!

                Comment


                • #9
                  я вот уже начинаю думать, что задача имеет два разных решения
                  git blame

                  Comment


                  • #10
                    Кстати говоря, вот, немного по теме:

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

                    Base* pbase = pDerived;

                    И объяснение этому следующее: располагая указателем на унаследованный класс, мы заранее знаем все, что в унаследованный класс входит, включая все его базовые классы, поэтому располагая таким знанием, ком%%%%%ор находит правильное значение для указателя на base (оно, кстати, не всегда численно равно значению указателя на унаследованный класс).

                    С другой стороны, мало кто знает (ну, меньше народа по крайней мере) что для указателей на data member Базового и Унаследованного классов неявное преобразование разрешено совсем в другом направлении:
                    int Derived::*pDerivedMember = Base::*pBaseMember;
                    Кто не верит - загляните в стандарт или скомпилите.

                    Объяснение этому следующее - и оно уже имеет отношение к теме:

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

                    А вот обратное - справедливо, т.к. указатель на данные в базовом классе всегда будет указывать на данные в пределах унаследованного класса, и поэтому такое преобразование законно
                    Last edited by xelaz; 14.02.2011, 22:11.
                    git blame

                    Comment


                    • #11
                      Ну так ничего особенно удивительного в этом нет: ты же преобразуешь не тип данных указателя, а его взаимоотношение с классом Base/Derived.
                      Strange women lying in ponds distributing swords is no basis for a system of government!

                      Comment


                      • #12
                        Думаю будит такой порядог (обьект Y содержит A):
                        ~Y
                        ~A
                        ~X

                        Потому что если бы обьект типа A был бы в X, то Y тут был бы вообще не нужен, так как и ежику понятно, что сначала вызывается деструктор самого derived класса, а вопрос с притензией на усложненность.
                        LiveDoco - Live SQL Server database structure explorer and documentation tool

                        Comment


                        • #13
                          Сообщение от Z1024 Посмотреть сообщение
                          Думаю будит такой порядог (обьект Y содержит A):
                          ~Y
                          ~A
                          ~X

                          Потому что если бы обьект типа A был бы в X, то Y тут был бы вообще не нужен, так как и ежику понятно, что сначала вызывается деструктор самого derived класса, а вопрос с притензией на усложненность.
                          Вот ежику как раз и не понятно )) Т.е. насчет порядка деструкторов - нивапрос, вопрос по построению как раз.

                          Т.е. предлагаете вариант

                          class X{}
                          class Y:X{A a;}

                          Я так и ответил в тесте. А щас вот думаю, что формально и мной предложенный вариант тоже верен. (там порядок вызова ~Y ~X ~A)

                          Еще никто мне не доказал обратное

                          Учитывая, что тест позволяет несколько ответов делать, возможно надо было тикнуть две галки
                          git blame

                          Comment


                          • #14
                            xelaz

                            Ну это был скорей всего технический тест а не лингвистический ))) поэтому правильный ответ может быть только 1 в этом случае )) А некоторая двусмысленность вопроса - косяк автора который лечится применением здравого смысла что мы (тут на форуме) и вы (там на несте) и сделали ))
                            LiveDoco - Live SQL Server database structure explorer and documentation tool

                            Comment

                            Working...
                            X