Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Сколько экземпляров и ссылок создается для базового подкласса?

Автор вопроса: rroОтветов: 3

В С# .NET у меня есть 2 конкретных класса. Класс A и B. Класс B является подклассом класса A.

Сколько экземпляров (объектов в куче) и ссылок из стека на объекты кучи создается для каждой строки кода:

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();

  • Это будет два экземпляра. Каждое использование new равно еще одному созданному объекту. Matt Greer 29.07.2010

constructorinstantiation

Ответы

Ответ 1 · рейтинг 4 · Igor Zevaka

Продолжая аналогию с тем, что объект - это воздушный шар, а ссылка - это веревка, привязанная к воздушному шару, в каждом из следующих случаев будет один шарик и одна веревка:

ClassB b = new ClassB(); //one reference, one heap object
ClassA a = new ClassB(); //one reference, one heap object

Запуск обоих одновременно создаст два объекта и две ссылки.

ИЗМЕНИТЬ Посмотрите на этот IL, сгенерированный из конструктора ClassB:

.method public hidebysig specialname rtspecialname
        instance void  .ctor() cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void InheritanceTest.ClassA::.ctor()
  IL_0006:  ret
} // end of method ClassB::.ctor

call instance void InheritanceTest.ClassA::.ctor() указывает, что он вызывает конструктор ClassA как функцию-член (а не как функцию объекта-члена). Это соответствует моему пониманию того, что происходит с экземплярами унаследованных классов, что производный класс - это просто все члены базового класса, за которыми следуют его собственные члены, аналогично C++.

Ответ 2 · kbrimington

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

Если у них есть члены, конечно, есть дополнительные ссылки на членов, но я думаю, что суть вашего вопроса не в этом.

Ответ 3 · рейтинг -1 · matrix

В первом случае - у вас будет только один экземпляр класса B. Во втором случае у вас будет один экземпляр класса B. Во втором случае экземпляр класса A создан не будет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы