首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-02-14 
msdn上的一个例子看不太懂,请高手讲解一下,关于virtual,new,override的/*如果你安装了msdnforvisualstudio

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虚方法表中去查找方法的地址,并进行调用,如果派生类重载了这个方法,那么基类的指针就调用派生类的重载的方法,如果没有实现,则基类指针就调用自已的虚方法)不知道我说明白了没有..


热点排行