虚方法重写

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时,执行的DoSomethingDerivedType重写的方法,而非父类。

所以在使用的虚方法重写时,需要特别注意。

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.抽象方法
要求派生类必须重载这个方法;

虚方法
告诉编译器,这个方法可以重写。
当基类的方法与派生类的方法重名时,
可以选择派生类的方法从基类继承并重写,
还是,把基类的方法隐藏起来。
追问:
抽象方法不能有实现体,什么意思?把基类的方法隐藏起来,如何隐藏
追答:
程序里没有什么方法是叫抽象方法的,那叫虚方法。

虚方法就是子类可以覆盖基类的方法。纯虚方法,是在子类里实现的,基类不实现的。
自己好好看看书,书上都有的,最基本的知识。


原文地址:https://www.cnblogs.com/xcsn/p/4544041.html