【问题标题】:how memory is allocated if inheritance is used?如果使用继承,如何分配内存?
【发布时间】:2020-05-25 12:54:53
【问题描述】:

我有课

class A
{
   public void Greet()
   {
      Console.WriteLine("Hii");
   }
}

class B : A
{
   public void Greet2()
   {
      Console.WriteLine("Hello");
   }
}

class Program
{
   public static void main(string args[])
   {
      B b = new B();
      b.Greet();
      b.Greet2();
   }
}

如何在堆空间中为基类和派生类分配内存。派生类是拥有基类的所有方法还是拥有基类的对象?

【问题讨论】:

  • 方法的处理方式和变量的内存处理方式是有区别的。为该类型的所有字段分配一个连续的内存区域,包括基类的所有字段。此外,内存中还有一块内存用于该类型,分配一次,其中包含虚拟方法表,其中包括该类型和基类的所有虚拟方法。
  • 非虚拟方法不以任何特定方式处理。相反,定义一次的原始方法将被调用,即使通过派生类调用,只需将this 引用传递给派生类型。
  • 基类B被实例化时,也就是A类也称为类构造函数,内存分别分配给A类和B类
  • @RezaJenabi 你能详细解释一下吗

标签: c# inheritance heap-memory


【解决方案1】:

派生类是否拥有基类的所有方法

根本没有为方法分配内存。方法仅分配用于存储,并且对象包含指向该类型的指针。并且 TYPE - 类,而不是实例 - 具有方法。如果它们不是静态的,所有方法都会获得指向类内存 (this) 的不可见指针。

当一个对象被创建时,分配给这个特定类型存储的内存,不多也不少。

【讨论】:

  • 我的疑问是,当B b = new B(); 被调用时,对象b 也可以调用基类的方法。那么派生类的基类实例会存放在哪里呢?
  • 在类型中,而不是在类中,正如我清楚地说的那样。该类型包含方法的跳转表,包括所有基类方法。
猜你喜欢
  • 2019-11-11
  • 2010-12-26
  • 2021-12-06
  • 1970-01-01
  • 2011-01-18
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
相关资源
最近更新 更多