呵呵 5裤衩终于合并成小星星 激动喜悦之后却是倍感压力啊 以后还得多多努力为避嫌 就出个关于继承的小题目 不要先复制去运行看结果 最好自己试着写一下结果
就当小练习 测测对基础是否扎实 然后写出为什么 解释好的给分哦大佬们就当路过吧 class A
{
public string Str = "A"; public void Show() { Console.WriteLine("Show A"); }
} class B : A
{
public string Str = "B"; public virtual void Show() { Console.WriteLine("Show B"); }
} class C : B
{
public override void Show() { Console.WriteLine("Show C"); }
} class D : C
{
public string Str = "D"; public void Show() { Console.WriteLine("Show D"); }
} class Program
{
static void Main(string[] args)
{
D d = new D();
C c = d;
B b = d;
A a = d;
Console.WriteLine(d.Str);
Console.WriteLine(c.Str);
Console.WriteLine(b.Str);
Console.WriteLine(a.Str);
Console.WriteLine("------------");
d.Show();
c.Show();
b.Show();
a.Show();
Console.ReadLine();
}
}
就当小练习 测测对基础是否扎实 然后写出为什么 解释好的给分哦大佬们就当路过吧 class A
{
public string Str = "A"; public void Show() { Console.WriteLine("Show A"); }
} class B : A
{
public string Str = "B"; public virtual void Show() { Console.WriteLine("Show B"); }
} class C : B
{
public override void Show() { Console.WriteLine("Show C"); }
} class D : C
{
public string Str = "D"; public void Show() { Console.WriteLine("Show D"); }
} class Program
{
static void Main(string[] args)
{
D d = new D();
C c = d;
B b = d;
A a = d;
Console.WriteLine(d.Str);
Console.WriteLine(c.Str);
Console.WriteLine(b.Str);
Console.WriteLine(a.Str);
Console.WriteLine("------------");
d.Show();
c.Show();
b.Show();
a.Show();
Console.ReadLine();
}
}
D
B
A
------------
Show D
Show C
Show B
Show A
我觉得是下面这样的,不过不确定D
B
B
A
-------------------
Show D
Show C
Show C
Show A另外是不是会有编译错误,要求使用new来覆盖呀。
B
B
A
---------
Show D
Show C
Show C
Show A
解释:
1、对于str这个变量的输出,由于子类都隐藏了父类的这个变量除类C外,因此输出时都输出自身类的这个变量的值,由于C类中str是由B类继承来的,所以值是‘B',因此结果为DBBA;
2、对于Show方法的调用与str大致差不多的情况。
D
B
B
A
------------
Show D
Show C
Show C
Show A原因:
1)派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不是这派生类删除了这些成员,只是不能再访问这些成员。2)类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
3)多态性,子类重写调用的就调用子类的方法、子类没有重写的就调用父类的虚方法。
请指点
B 因为class c继承与class b
B 因为class b继承与class a,而class b中有相同的变量,所以覆盖了
A
------------
show D 因为class d继承class c, 但是没有override,也就是不可重写,所以是覆盖,显示show d
show c 因为class c继承class b, class b标注了virtual,继承此类的,此类中成员可以被重写,class c使用了override,所以重写了其父类show c 由于class b被class c重写了,所以还是这个值
show a 这个不用解释了吧
由于类C的override对标记为virtual的父类B重写造成输出是Show C
至于8楼所说警告是存在的,原因是继承类中对父类进行隐藏理应添加字符new,这样警告就不会有了
B
B
A
--------
SHOW D
SHOW C
SHOW C
SHOW A
自己做的是这个。运行也是。虽然知道override 会对virtual重写。但是override何时重写父类virtual方法不是很清楚。望楼主或者其他高手赐教
类在加载的时候就会在Loader Heap中创建相与类关联的方法表。
而我们的创建的实例是在GC HEap上 对象实例中有个附加成员TypeHandle指向了开始我们所说的方法表的地址,来达到关联。
也就是说这个方法表在内存中仅存一份,既然这样你认为何时重写呢?
当然是类第一次加载的时候就已经做完了 而不是什么创建实例的时候而重写
D
B
A---------
D
C
C
A
不知道对不对
http://blog.csdn.net/clq271520093/article/details/3960727
至于这题嘛,读了一遍,子类隐藏了父类,在C#语法中子类隐藏父类字段或者方法应该要用new,应该有警告
直接给我的答案算了,就在方法b.Show()有点拿不准,C override了B的方法,好像和属性不大一样。
D
B
B
A
------------
Show D
Show C
Show C
Show A
show方法:方法也是一样的会被继承,b是virtual定义的虚函数,c中override重写了此函数,所以输出时b会输出c.
D
B
A
------------
Show D
Show C
Show B
Show A好难。
去运行看看
D d = new D();
这句话很重要的哦 调用子类还是父类方法是取决于创建了的对象是子类还是父类!
很明显程序中自始至终只有一个实例对象 那就是D
B
B
A
------------
Show D
Show C
Show C
Show A
Console.WriteLine(c.Str);//B
Console.WriteLine(b.Str);//B
Console.WriteLine(a.Str);//A
Console.WriteLine("------------");
d.Show();//show D
c.Show();//show C 多态
b.Show();//show C 多态
a.Show();//show A
B
B
A
------------
Show D
Show C
Show C
Show A
SHOW D
SHOW C
SHOW C
SHOW A为什么是 以上结果,? 不是下面的结果,我的分析对不对?
D d = new D();
C c = d;
B b = d;
A a = d;
将上面这段改成:
D d = new D();
C c = new C();
B b = new B();
A a = new A();
效果不一样,能解释一下吗?
D d = new D();
C c = d;
B b = d;
A a = d;
将上面这段改成:
D d = new D();
C c = new C();
B b = new B();
A a = new A();
效果不一样,能解释一下吗?
--------------引用 51 楼 yanele 的回复-----------------------上面只有一个对象, 只因为,他们是继承关系,才可以用等号串接,
他们所指同一片内存,任何之间的操作 ,都相关!_______________________
| |
| __________________|
| | ____________|
| | | ________ |
| A | B | C |D | |
| | | |——— |
| | |——————|
| | |
| |—————————|
| |
|———————————|这样的包含关系下面的有四个对象,每个对象占用不同的内存,以上个人见解不知是否正确!
大家帮忙看看吧
实例不同 内存中实例对象里的TypeHandle指针指向的Load Heap(方法表)也就截然不同
--
DCCA
少使用覆盖,用方法名区分.如果要使用请使用new明确标出
B
B
A
------------
Show D
Show C
Show C
Show AC继承B的属性,所以Console.WriteLine(c.Str);输出的应该是B;
B的Show方法是虚方法,要调用他就要去看他的实现, b.Show();的输出结果是 Show C
B
B
A
----------
Show D
Show C
Show C
Show A
B
B
A
--------
Show D
Show C
Show C
Show A
吧,不是很确定
子类获得父类的非私有数据和行为。子类可以强制转换为父类。但其操作范围却被限定在父类中。
C c = d;
B b = d;
A a = d;
由于C类中没有定义Str变量,故输出值是其直接父类的Str。
所以应该是
B
B
A
方法:
c.Show();
b.Show();
a.Show();
由于B类的方法,被C类重写(override),故输出的是Show C
所以应该是
Show C
Show C
Show A除非定义B b1=new B();b1.Show();负责不会输出Show B
这是我的理解。呵呵。可能有不对的地方。。
""
""
""
-------------
Show D
Show C
Show C
Show A
B
B
A
-------------
Show D
Show C
Show C
Show A
B
B
A
---
D
C
C
A
B
B
A
---------------
D
C
C
A
C 由于没有字段 Str,所以使用基类的,那么就显示 B。
C 的 Show 方法覆盖了 B 的 Show 方法,所以调用 b.Show() 实际为 C 的 Show 方法,但这种覆盖不具有传递性,所以 a.show() 还是调用的 A 的 Show 方法。
另外这个题几个地方可以加上 new。
b
b
a
其中c没有str这个属性 继承父类属性了 因为重名 需要用个new吧 一般都搞方法 属性还真没试过show 方法d
c
c
aC类重写了b类的show方法 所以应该都是c
virtual,new,override,sealed 在继承链中作用