2015-05-20 2 views
0
class BC 
{ 
    public virtual void Display() 
    { 
     System.Console.WriteLine("BC::Display"); 
    } 
} 

class DC : BC 
{ 
    public virtual void Display() 
    { 

     System.Console.WriteLine("DC::Display"); 

    } 
} 

class TC : DC 
{ 
    public virtual void Display() 
    { 
     System.Console.WriteLine("TC::Display"); 
    } 
} 



class Program 
{ 
    public static void Main() 
    { 
     BC b; 
     b = new BC(); 
     b.Display(); 

     b = new DC(); 
     b.Display(); 

     b = new TC(); 
     b.Display(); 


    } 
} 

Почему вывод не «BC :: Display DC :: Display TC :: Display»?Почему выход следующей программы => BC :: Display BC :: Display BC :: Display

+0

Проверьте это: https://stackoverflow.com/questions/23313408/why-is-cant-use-overriding-method-in -c-not-about-keyword? rq = 1 – Nikola

+1

Предупреждения компилятора дают подсказку, почему это происходит. Вы скрываете унаследованных членов. – Dirk

ответ

0

Если вы скомпилировать его в Visual Studio, вы получите эти предупреждения:

Warning 2 'Workbench.Program.DC.Display()' hides inherited member 'Workbench.Program.BC.Display()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. C:\Users\Alberti\Documents\Visual Studio 2013\Projects\Workbench\Workbench\Program.cs 328 29 Workbench 
Warning 3 'Workbench.Program.TC.Display()' hides inherited member 'Workbench.Program.DC.Display()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. C:\Users\Alberti\Documents\Visual Studio 2013\Projects\Workbench\Workbench\Program.cs 338 29 Workbench 

Вы должны использовать override вместо virtual в DC и TC, иначе вы делаете new virtual и создание нового метода, не «переопределяет» BC.Display, а просто «скрывает» его.

Существует хорошее объяснение здесь: https://stackoverflow.com/a/6162547/613130 о разнице между virtual/override и new

0

Только метод в базовом классе должен быть помечен virtual. Методы в производных классах должны быть отмечены как override, иначе они скрывают основные методы. Поскольку они «разные» методы, а b имеет тип BC, компилятор направит все вызовы на BC.Display.

Смежные вопросы