class A 
{ public A( ) { Console.WriteLine("A"); } } 
class B:A 
{ public B() { Console.WriteLine("B"); } } 
class Program
 { public static void Main() {
B b = new B(); Console.ReadLine(); } }
为什么答案是A B

解决方案 »

  1.   

    能不能告诉我运行B b = new B();
    内存是怎么变化的
      

  2.   


    很经典的C#笔试题。
    有兴趣还可以试试A a = new B();
      

  3.   

    经是经典,不过也是基础。继承链是需要弄个究竟的(比如new virtual override sealed在继承链中的作用)。
      

  4.   

    按大家的解释构造子类B要先构造父类A 所以楼主的答案是A B
    但是  A a=new B();
    父类用子类来构造,但是构造子类又要先构造父类  算是够纠结的 答案也是A B吗?
      

  5.   

    “父类用子类来构造”是不对的,new B()时对B的实例化,自然会先构造基类A,A不过是一个变量类型而已;a内部的对象指针保存了对B的引用,在编译时是调用A的成员,但在运行时是针对A,B的继承链。
      

  6.   


    如果不明白,你可以写 { public A( ) { Console.WriteLine("A---我是个{0}", this.GetType().Name); } }  
      

  7.   

    运行结果是A B,不过对何时调用B的构造函数还是没能理解
      

  8.   


    所有回复中,只有你这个是明显有错的。什么“爸爸生出儿子”?这叫做继承?假如写  { public A( ) { Console.WriteLine("A---我是个{0}", this.GetType().Name); } } 就可以看到.NET正确地实现了面向对象系统的要求,在这个它会打印出
         A---我是个B
    也就是说,你所谓的爸爸,其实就是儿子自己冒充的。你怎么解释这种冒冲甚至乱伦现象?唯一的解释就是,那种机械地什么“爸爸生出儿子”的观念,正是产生混乱和纠结的根源。只要避免这种误解,就能初步理解什么叫做面向对象了。
      

  9.   

    继承不是什么“爸爸生出儿子、父母把遗产留给子女”这种低级的观念。以前曾经有一本写的不错、编程思路清晰的关于使用.net来讲解有关架构方面知识的书,其中有专门的一章讲解面向对象基本概念中中,竟然以“好爸爸、坏爸爸”、“富人死后把遗产留给阔少、穷人死后把遗产留给乞丐”这类概念来解释,纯粹是这本书中一大败笔。你也可以看看自己读过的好书中有没有类似的败笔。继承不是指两个个体之间的关系,而是指一个个体有多种身份,而这些身份之间又有抽象化或者具体化的联系。例如白马也是马,电视机也是家电,民工也是劳动者,劳动者也是人,等等,这些纯粹是概念性的,而不是个体之间的联系。对象个体是唯一的,这是不什么“封装、继承、多态”更加重要的面向对象概念。对象唯一性不会随着类型的变化而变化,就好象不管别人怎样给你分类,甚至给你分类为“茶具”,你还是你自己。那么为什么在程序中调用构造函数就很明显了。构造函数的作用它不是“分配内存单元”这个意思,它只是用来初始化数据值的,而分配内存数据单元之类的工作早在调用构造函数之前就完成了。比如说A中的代码可以为最终这个B类对象中属于A类定义的那部分数据赋初始值,而B类中的代码可以随后为最终这个B类对象中属于B类定义的那部分数据赋初始值,这两个步骤在初始化时缺一不可。
      

  10.   

    继承不是什么“爸爸生出儿子、父母把遗产留给子女”这种低级的观念。以前曾经有一本写的不错、编程思路清晰的关于使用.net来讲解有关架构方面知识的书,其中有专门的一章讲解面向对象基本概念中中,竟然以“好爸爸、坏爸爸”、“富人死后把遗产留给阔少、穷人死后把遗产留给乞丐”这类概念来解释,纯粹是这本书中一大败笔。你也可以看看自己读过的好书中有没有类似的败笔。继承不是指两个个体之间的关系,而是指一个个体有多种身份,而这些身份之间又有抽象化或者具体化的联系。例如白马也是马,电视机也是家电,民工也是劳动者,劳动者也是人,等等,这些纯粹是概念性的,而不是个体之间的联系。对象个体是唯一的,这是不什么“封装、继承、多态”更加重要的面向对象概念。对象唯一性不会随着类型的变化而变化,就好象不管别人怎样给你分类,甚至给你分类为“茶具”,你还是你自己。那么为什么在程序中调用构造函数就很明显了。构造函数的作用它不是“分配内存单元”这个意思,它只是用来初始化数据值的,而分配内存数据单元之类的工作早在调用构造函数之前就完成了。比如说A中的代码可以为最终这个B类对象中属于A类定义的那部分数据赋初始值,而B类中的代码可以随后为最终这个B类对象中属于B类定义的那部分数据赋初始值,这两个步骤在初始化时缺一不可。
      

  11.   

    sp1234每次看见大家把继承误解为“父子”关系的时候,都会详细细致的解释,我觉得很赞。这个误区很多人都被一些书诓了。
    主要是要理解sp1234说的:继承不是指两个个体之间的关系,而是指一个个体有多种身份,而这些身份之间又有抽象化或者具体化的联系 这句话的含义
      

  12.   

    “继承”根本不是爸爸和儿子的关系,“继承”本身的翻译就有问题。在JAVA里“继承”写作"Extends",其实“继承”的意义是扩展。是a类扩展那个A类的意思,但基类还是A类,是a类的基础。