C#,继承,父类与子类 的一个问题

publicclassA{publicvoidm(){Console.WriteLine("A");}}publicclassB:A{publicvoidm(){Cons... public class A
{
public void m()
{
Console.WriteLine("A");
}
}

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

class Program
{
static void Main(string[] args)
{
A b = new B();
((A)b).m;
}
}
话说,b到底是A类的还是B类的?迷糊啊
谢谢各位大侠
我知道怎么样能打出B,可是。。。上边的这个是我们去年的考试题啊考试题。我就是想知道根本原因~~~~(>_<)~~~~ 不然明天考试在遇到了咱不懂发懵了。。。%>_<%我们那bt老师就爱高一些混乱的东西让你写结果。。。

A b=new B(),new不是负责分配空间么,分配的不是B类型的空间么?(咱接触C#时间不长,瞎说表骂我笨)。
class Personne
{ string s;
public Personne() { }
public Personne(string s)
{ this.s = s; }
public virtual void parler()
{ Console.WriteLine("hum! {0}", s); }
}
class Adulte : Personne
{ string s;
public Adulte(string s)
{ this.s = s; }
public virtual void parler()
{Console.WriteLine("hi {0}",s);}
}
class Program
{
static void Main(string[] args)
{Personne P1 = new Personne("111");
Adulte P2 = new Adulte("222");
P1 = P2;
P1.parler();
}
}
结果为啥是hum,不是hum222?
展开
 我来答
whbah
2011-11-07 · TA获得超过219个赞
知道小有建树答主
回答量:268
采纳率:0%
帮助的人:138万
展开全部
继承的时候注意关键字virtural override 和new的使用
如果基类的方法是要由子类多态实现的,在方法前面加个virtual
例如:
public class A
{
public virtual void m()
{
Console.WriteLine("A");
}
}
子类在继承的时候,可以根据实际情况看看是要采用override(覆盖)或者new(隐藏)基类的方法。
如果采用的是Overrid 则当A _a=new B()的时候,由于基类的方法被子类覆盖(_a使用的是子类的方法),所以输出的是B
如果采用的是new 则当A_a=new B()的时候,由于基类的方法只是被隐藏(还是存在的_a)所以输出的是A
你那个的话输出的是A,
B的话实际上是
public class B : A
{
public void A.m()
{Console.WriteLine("A");
}
public void m()
{
Console.WriteLine("B");
}
}
因为A.m这个方法只是被继承了 没有被重写和覆盖,所以最后输出的是A.

参考资料: www.msdn.com

将米有深法0l
2011-11-07
知道答主
回答量:52
采纳率:0%
帮助的人:7万
展开全部
你犯了一个非常严重的错误,在C#中所有不加virtual修饰的方法都是实例方法!
所以编译器认为你B类中的m()方法是一个新的方法,不是重写的A的方法。所以你这里虽然打印出来的是"A",但是b它实际上是B类。
public class A
{
public virtual void m()
{
Console.WriteLine("A");
}
}

public class B : A
{
public override void m()
{
Console.WriteLine("B");
}
}
如果是这样写得话,打印出来的结果就是B。这样编译器就会认为你重写了父类的m()方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友42ba240c
2011-11-08 · 超过24用户采纳过TA的回答
知道答主
回答量:136
采纳率:0%
帮助的人:52.5万
展开全部
新手学C#就这么费劲,特么的老师,尽瞎教学生!
我告诉你啊

A b = new B();
((A)b).m;
其实这根本就是尽瞎扯淡,老师为了教会你继承,就这么教,他的意思你明白就行了,千万别按他这个来啊,他这是脱了裤子放屁,而且还把学生弄蒙了...
总之意思就是将B实例化为b,然后表示出来。
virtual 表示虚方法,用override来复写,
A为父类,B为子类,
A a=new B();
这时候就是a就是B类
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
独爱吾菲
2011-11-08
知道答主
回答量:7
采纳率:0%
帮助的人:1.2万
展开全部
B类的。因为关键字new 创建的B类的实例。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式