7.写出程序的输出结果
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 new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();//A
a.Fun();//B
}
}
7. A
B
A.Fun()//解析一下这些输出结果8. 写出程序的输出结果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();//2 解析一下这些输出结果
A a = new A();//5
a.Fun2(b);//1
b.Fun2(a); // 6
}
}
解决方案 »
- VFP中的临时表操作在C#中有类似的吗?
- 好心人帮我看看C#语言吧
- 如何在安装部署中注册一个服务
- 如何去掉datagrid可输入状态时的闪烁光标
- 大家说说我要多久才能拿到我下一个三角
- 请问该怎样设置Datagrid的页眉(第一行)的显示值?
- 我做的网址收藏软件,大家看看。要源代码的,请出5元人民币
- ListView里refresh方法的使用问题.
- C#中调用哪个函数可得到数据连接的返回值???就像Delphi中的PromptDataSource(_,_)完成相同的功能
- 请问如何通过点击一个按钮,然后弹出
- C# 怎么判断dataGridView1是否有记录
- [散分]做一个类似ObjectDocker的程序.沾边者就给分
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 new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();//A
a.Fun();//B
}
}7.
A
B
A.Fun()A a = new B();--〉创建子类B 对象,先调用父类无参数构造函数,
然后调用自己的无参数构造函数.就是说先是调用父类构造,然后是子类。
A.Fun()--〉Fun()是一个重写方法,重写方法的调用只与生明类型有关,
因为a对象的声明是A类,虽然他使用B类构造。而覆盖方法,也就是说虚方法是跟调用者的运行时类型有关,
如果 Fun 在B里面override的话,那么a.Fun()输出结果是B.Fun()。
//解析一下这些输出结果8. 写出程序的输出结果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
a.Fun2(b):
首先走到a.Fun2, 调用 a.Fun1(1)的时候,因为当前对象a是用B构造的,Fun1是一个override方法,所以调到
B 里面的 base.Fun1 (i + 1); 输出2。然后走到Fun1(5),这个是直接调用的,就说前面没有a.或者b.
所以就调用A的方法,输出5。
b.Fun2(a);
b 对象的 Fun2是从a继承过来的,没有覆盖,所以他将执行a.Fun1(1);和Fun1(5);
a.Fun1(1) 的时候,因为当前Fun2(A a)方法的a是用 A构造,所以调用A.Fun1(),输出1。
Fun1(5)的时候,因为当前调用者对象是B,而Fun1是覆盖方法,所以到 override void Fun1(int i)
调用base.Fun1 (i + 1);输出6。
}
}//以下是添加debug信息的 程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
Console.WriteLine("A-virtual void Fun1");
}
public void Fun2(A a)
{
a.Fun1(1);
Console.WriteLine("A- Fun2");
Fun1(5);
}
} public class B : A
{
public override void Fun1(int i)
{
Console.WriteLine("B- override void Fun1");
base.Fun1(i + 1);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();//2
A a = new A();//5
a.Fun2(b);//1
b.Fun2(a); // 6
Console.ReadKey();
}
}
}