B继承于A,A a=new B()与B a=new B()区别

ron8291 2007-06-16 07:04:19
如题,不一样吧?有哪方面的区别?
...全文
3288 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
饺克力克 2011-11-20
  • 打赏
  • 举报
回复
MARK学习了。
feiyuan0204 2009-09-01
  • 打赏
  • 举报
回复
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun");
}
}
public class B : A
{
public B()
{
Console.WriteLine('B');
}
////定义为抽象类则不能被使用
//public override void Fun()
//{
// //base.Fun();
// Console.WriteLine("B.Fun()");
//}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();//调用基类的虚函数
/*
前提:A是B的父类。
A a = new B();
这一句的过程是这样的,
1)创建一个类A的引用a
2)创建一个类B的实例
3)把类B的引用赋值给a
内存里只有一个B的实例。
如果你调用了类A中被类B重写的方法,那么得到的效果是你调用了这个已经被B重写的方法。
如果A是抽象类的有虚方法,子类隐藏基类的方法,则调用父类的同名方法
* */
//A a = new A();//这样有错,抽象类不能被实例化
//B b = new B();
//b.Fun();//调用子类的虚方法
}
}
}
ron8291 2007-07-02
  • 打赏
  • 举报
回复
感谢前辈们的热情,可惜分压的太少了,能不能追加?
老腊肉泡酒 2007-06-19
  • 打赏
  • 举报
回复
一个是父类的对象,一个是子类的对象。
photoplan 2007-06-19
  • 打赏
  • 举报
回复
A a = new B() 和 B a = new B()

假设 B 里新加了一个方法 M,如果是第一种,a.M() 是不可以的,好像就这么点区别。





codeangel 2007-06-19
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace TEST
{

class A
{
public string GetA()
{
return "aa";
}

public virtual string GetAB()
{
return "aabb";
}


}

class B : A, IMyInterface
{
public string GetB()
{
return "bb";
}

public string GetC( string a,string b)
{
return a+" "+b;
}

public string GetC()
{
return "www.wsoft.net";
}

public string GetC(string name)
{
return name;
}

public override string GetAB()
{
return "bbaa";
}
}


class Program
{
static void Main(string[] args)
{
A a = new B();
B b = new B();

//调用继承后的方法
System.Console.WriteLine(a.GetA());

//调用重写方法
System.Console.WriteLine(a.GetAB());

//调用接口
System.Console.WriteLine(b.GetC("Super"));

//调用有参数的方法
System.Console.WriteLine(b.GetC("My name is ","super"));

//调用无参数的方法
System.Console.WriteLine(b.GetC());

//调用委托
PrintStr myPrint = new PrintStr();
PrintHandler myHandler = null;
myHandler += new PrintHandler(myPrint.CallPrint); // 将委托链接到方法,来实例化委托
if (myHandler != null) myHandler("Hello World!"); // 调用委托,相当于匿名调用委托所链接的方法

System.Console.ReadLine();

}


}


//写义接口类
public interface IMyInterface
{
//声明接口方法
string GetC(string name);

}


#region 构造函数
class myResult
{
private string m_Result;
public string Result
{
get {return m_Result;}
set{ m_Result=value;}
}
}
#endregion

public delegate void PrintHandler(string str);// 声明委托类型
public class PrintStr
{
public void CallPrint(string input) //定义委托方法
{
System.Console.WriteLine(input);
}
}


}
GODProbe 2007-06-19
  • 打赏
  • 举报
回复
sourgrapes 2007-06-19
  • 打赏
  • 举报
回复
路过
shen5924624 2007-06-19
  • 打赏
  • 举报
回复
mayiding() 对的
Hollygiga 2007-06-19
  • 打赏
  • 举报
回复
内存里只有一个B的实例。

变量只是一个容器,就像普通在超市里买的三块钱一个的玻璃杯也能装香槟一样,但是口感比香槟杯差多了。

在这里也是这样,new B()好比是打开了一瓶香槟,A a = new B();与B a = new B(),在香槟上是没有区别的,区别的只不过是前者的a是玻璃杯,后者的a是香槟杯。
这个香槟,就是对象在内存中的实例,而口感差的意思就是,后者的a要比前者多出一些方法。



这个解释太好了,我终于懂了阿
youlxsbobo 2007-06-18
  • 打赏
  • 举报
回复
Ivony(授人以鱼不如授人以渔,上海谋生)
意思也就是说A b =new B();只要new是谁系统就为谁申请内存?也就是说b就是B的实例。
如果此时我将b——>(A)b,那在内存中又发生了什么变化呢?

个人感觉是如果是继承关系,new B()应该是先调用A的构造函数,如果调用了A的构造函数能不能说此时内存中已经存在一个A的实例了呢?调用完A的构造函数,B再掉用自己的构造函数,这个时候又有一个新对象b在内存中被构造了?还是b直接就在已经给A分配的内存段上进行了相应的扩充呢?小弟不求甚解。。。
chenyu112 2007-06-18
  • 打赏
  • 举报
回复
学习
LixingTie 2007-06-18
  • 打赏
  • 举报
回复
区别?理解成这样会清楚点.
object a = new String("123");
string a = new String("1223");
job_2006 2007-06-18
  • 打赏
  • 举报
回复
学习
Ivony 2007-06-18
  • 打赏
  • 举报
回复
内存里只有一个B的实例。

变量只是一个容器,就像普通在超市里买的三块钱一个的玻璃杯也能装香槟一样,但是口感比香槟杯差多了。

在这里也是这样,new B()好比是打开了一瓶香槟,A a = new B();与B a = new B(),在香槟上是没有区别的,区别的只不过是前者的a是玻璃杯,后者的a是香槟杯。
这个香槟,就是对象在内存中的实例,而口感差的意思就是,后者的a要比前者多出一些方法。
hertcloud 2007-06-18
  • 打赏
  • 举报
回复
多态 这里写的很好

http://blog.csdn.net/oury/archive/2005/02/07/283835.aspx
Eri 2007-06-18
  • 打赏
  • 举报
回复
youlxsbobo() ( ) 信誉:100 Blog 加为好友 2007-06-18 08:31:07 得分: 0


那我想请问各位 A a = new B()这个时候系统内存是怎么样分配的?在内存中是否有A的实例?或者说B继承与A,无论是A a = new B();还是B b = new B();都是先在系统内存中先申请A的实例,如果需要B的实例!只是在A内存的基础上进行扩展,不知道小弟这样理解对不对?
还有很多地方不清楚的,还望各位指点。


---------------------

这问题我也想知道,前不久有人法帖问。
B b = new B();
系统内有没有A的实例,如果有,如何访问。
webhermit 2007-06-18
  • 打赏
  • 举报
回复
mark!
youlxsbobo 2007-06-18
  • 打赏
  • 举报
回复
那我想请问各位 A a = new B()这个时候系统内存是怎么样分配的?在内存中是否有A的实例?或者说B继承与A,无论是A a = new B();还是B b = new B();都是先在系统内存中先申请A的实例,如果需要B的实例!只是在A内存的基础上进行扩展,不知道小弟这样理解对不对?
还有很多地方不清楚的,还望各位指点。
gwallan 2007-06-18
  • 打赏
  • 举报
回复
mark
加载更多回复(41)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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