1.实例解析
控制台程序
class Program { static void Main(string[] args) { DerivedType derivedInstance = new DerivedType(); string line; while ((line = Console.ReadLine()) != null) { Console.WriteLine("----"); } } } public class BadlyConstructedType { protected string initialized = "No"; public BadlyConstructedType() { Console.WriteLine("Calling base ctor."); // Violates rule: DoNotCallOverridableMethodsInConstructors. DoSomething(); } // This will be overridden in the derived type. public virtual void DoSomething() { Console.WriteLine("Base DoSomething"); } } public class DerivedType : BadlyConstructedType { public DerivedType() { Console.WriteLine("Calling derived ctor."); initialized = "Yes"; } public override void DoSomething() { Console.WriteLine("Derived DoSomething is called - initialized ? {0}", initialized); } }
结果
分析:
实例化DerivedType时候,调用BadlyConstructedType时,执行的DoSomething是DerivedType重写的方法,而非父类。
所以在使用的虚方法重写时,需要特别注意。
2.原理描述
百度知道:http://zhidao.baidu.com/link?url=P5NtEj7S-fzuzKSai4WynOQcRctscet2iBJxcqFYppcVqGMZjO-9ZzeB5jBZFDapguZR3sadLlGaQPHFJP_0JYh_c5Tmv8Z6Ae1mcK_Oxla
c# 虚方法是用virtual来修饰?表明可以被重写?一般用在抽象类中?
虚方法:
1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写
virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
相应的
sealed关键字标示此方法不可以被重写
虚方法和抽象方法的区别:
1.虚方法可以有实现体,抽象方法不能有实现体。
2.抽象方法
要求派生类必须重载这个方法;
虚方法
告诉编译器,这个方法可以重写。
当基类的方法与派生类的方法重名时,
可以选择派生类的方法从基类继承并重写,
还是,把基类的方法隐藏起来。
追问:
抽象方法不能有实现体,什么意思?把基类的方法隐藏起来,如何隐藏
追答:
程序里没有什么方法是叫抽象方法的,那叫虚方法。
虚方法就是子类可以覆盖基类的方法。纯虚方法,是在子类里实现的,基类不实现的。
自己好好看看书,书上都有的,最基本的知识。