По аналогии с тем, что объект является воздушным шаром, а ссылка является строкой, привязанной к воздушному шару, в каждом из следующих случаев будет один воздушный шар и одна строка:
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 ++.