读书人

msdn上的一个例子看不太懂请高手讲解

发布时间: 2012-02-14 19:19:19 作者: rapoo

msdn上的一个例子看不太懂,请高手讲解一下,关于virtual,new,override的
/*

如果你安装了 msdn for visual studio 2005, 下面这段代码可以在这里找到:

ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/323db184-b136-46fc-8839-007886e7e8b0.htm

*/


using System;

// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine( "Four wheels and an engine. ");
}
}

// Define the derived classes
class ConvertibleCar : Car
{
public new virtual void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine( "A roof that opens up. ");
}
}

class Minivan : Car
{
public override void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine( "Carries seven people. ");
}
}


public class test
{
public static void Main()
{
Car[] cars = new Car[3];
cars[0] = new Car();
cars[1] = new ConvertibleCar();
cars[2] = new Minivan();
foreach (Car vehicle in cars)
{
System.Console.WriteLine( "Car object: " + vehicle.GetType());
vehicle.DescribeCar();
System.Console.WriteLine( "----------\n ");
}
Console.ReadKey();
}
}


输出的结果为什么不是:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------
呢。

请高手们用最通俗的语言讲解一下,能够再辅以一两个小例子加深理解那是最好。
尤其是 new , override的区别和用法

我很少上csdn,没什么分,但诚心求助,请帮忙带一把




[解决办法]
这是一个显著的多态的例子

这需要从car类看起:
DescribeCar()方法是Virtual,说明他的派生类可以重载这个方法;

其派生类:ConvertibleCar 中的DescribeCar()方法又是虚了,所以隐藏了Car()类的DescribeCar方法
派生类:Minivan 中重载了DescribeCar()方法.
(怎么说呢,如果基类中有虚方法,而在其派生类中重载了这个方法(override,且返回值参数一至),当把派生类的指针赋给基类的指针时,如果用基类的指针来调用这个重载的方法,那么就会在VMT虚方法表中去查找方法的地址,并进行调用,如果派生类重载了这个方法,那么基类的指针就调用派生类的重载的方法,如果没有实现,则基类指针就调用自已的虚方法)不知道我说明白了没有..


读书人网 >C#

热点推荐