我是初学者,想请教高手们一个简单的问题谢谢

u010040051 2013-04-08 09:49:01
class A
{
public A()
{ Console.WriteLine("a"); }
public virtual void Hello()
{ Console.WriteLine("HA"); }
public void M()
{ Console.WriteLine("M"); }
}
class B : A
{
public B()
{ Console.WriteLine("b"); }
public override void Hello()
{
Console.WriteLine("HB");
}

}
class C : B
{
public C()
{ Console.WriteLine("c"); }
public override void Hello()
{
Console.WriteLine("HC");
}
}
static void Main(string[] args)
{

B b = new C();
b.Hello();
b.M();

Console.ReadLine();

}
这个主函数中不是没有调用构造函数吗?为什么会输出A,B,C
...全文
149 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LemonSmile_ 2013-04-09
  • 打赏
  • 举报
回复
引用 9 楼 liuyuxuan2388 的回复:
引用 6 楼 sp1234 的回复:引用 3 楼 u010040051 的回复:B b=new C();是什么意思?是把子类C的方法赋给类B吗? 一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。 ……
我应该自己运行看答案,大神我错了
iceMung 2013-04-09
  • 打赏
  • 举报
回复
引用 9 楼 liuyuxuan2388 的回复:
引用 6 楼 sp1234 的回复:引用 3 楼 u010040051 的回复:B b=new C();是什么意思?是把子类C的方法赋给类B吗? 一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。 ……
a b c HC M
LemonSmile_ 2013-04-09
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
引用 3 楼 u010040051 的回复:B b=new C();是什么意思?是把子类C的方法赋给类B吗? 一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。 变量b虽然定义为类型B,但是运行时……
大神,想问下完整的输出内容是什么?就只有ABC?
Kim_Du 2013-04-09
  • 打赏
  • 举报
回复
又碰见这个问题了,这是个老问题了,好好理解下继承中构造函数的调用顺序。
u010040051 2013-04-08
  • 打赏
  • 举报
回复
一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。 我不知道能不能这样说,既然C的实例可以多态地用在B类实力操作中,那为什么还要调用B的构造函数呢?
  • 打赏
  • 举报
回复
引用 3 楼 u010040051 的回复:
B b=new C();是什么意思?是把子类C的方法赋给类B吗?
一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。 变量b虽然定义为类型B,但是运行时它引用了一个C类实例化对象。这就好像我们说“1234号病人是住院部病人,4567号病人是门诊病人”,我们生活中时时刻刻会使用多态的用法。面向对象编程设计中正是对应这种自然而然的习惯的。
轻尘 2013-04-08
  • 打赏
  • 举报
回复
B b = new C(); 这句话就是调用构造函数创建对象。
  • 打赏
  • 举报
回复
带参数的构造函数要调用父类的构造函数,需要显式写上 base 关键字来调用。但是无参构造函数则不需要,c#会自动生成调用base的语句。
u010040051 2013-04-08
  • 打赏
  • 举报
回复
B b=new C();是什么意思?是把子类C的方法赋给类B吗?
cheng2005 2013-04-08
  • 打赏
  • 举报
回复
因为有儿子必须现有父亲 换句话说就是,构建一个类的实例 一定要先构造它的父类。在继承链上的从根到叶的顺序调用构造方法,当然不一定是无参构造方法,也可能是显式的调用有参构造方法。
u010040051 2013-04-08
  • 打赏
  • 举报
回复
为什么输出a,b,c?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧