虚方法重写

简介: 1.实例解析 控制台程序 class Program { static void Main(string[] args) { DerivedType derivedInstance = new DerivedType()...

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

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

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


相关文章
|
9月前
|
存储 编译器 C++
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
99 0
|
5月前
|
编译器
【多态-动态绑定-向上转型-抽象类】
【多态-动态绑定-向上转型-抽象类】
27 0
|
安全 编译器 C语言
【七、多态】动/静态联编、虚析构函数、虚函数(虚函数表与VPTR指针)、重写与重定义
【七、多态】动/静态联编、虚析构函数、虚函数(虚函数表与VPTR指针)、重写与重定义
171 0
【七、多态】动/静态联编、虚析构函数、虚函数(虚函数表与VPTR指针)、重写与重定义
|
存储 C++ 开发者
你还不进来看看C++类与对象【7】 —— 动态多态底层原理剖析&&(纯)虚析构解决父类指针不能释放子类属性问题嘛
你还不进来看看C++类与对象【7】 —— 动态多态底层原理剖析&&(纯)虚析构解决父类指针不能释放子类属性问题嘛
110 0
你还不进来看看C++类与对象【7】 —— 动态多态底层原理剖析&&(纯)虚析构解决父类指针不能释放子类属性问题嘛
|
存储 编译器 C++
【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表(一)
虚表是编译器的实现,而非C++的语言标准。上一章我们学习了多态的概念,本章我们深入探讨一下多态的原理。文章开头先说虚表指针,观察编译器的查表行为。首次观察我们先从监视窗口观察美化后的虚表 _vfptr,再透过内存窗口观察真实的 _vfptr。我们还会探讨为什么对象也能切片却不能实现多态的问题。对于虚表到底存在哪?我们会带着大家通过一些打印虚表的方式进行比对!铺垫完虚表的知识后,会讲解运行时决议与编译时决议,穿插动静态的知识点。文章的最后我们会探讨单继承与多继承的虚表,多继承中的虚表神奇的切片指针偏移问题,这块难度较大,后续我们会考虑专门讲解一下,顺带着把钻石虚拟继承给讲了
423 0
【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表(一)
|
存储 编译器 C++
【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表(二)
虚表是编译器的实现,而非C++的语言标准。上一章我们学习了多态的概念,本章我们深入探讨一下多态的原理。文章开头先说虚表指针,观察编译器的查表行为。首次观察我们先从监视窗口观察美化后的虚表 _vfptr,再透过内存窗口观察真实的 _vfptr。我们还会探讨为什么对象也能切片却不能实现多态的问题。对于虚表到底存在哪?我们会带着大家通过一些打印虚表的方式进行比对!铺垫完虚表的知识后,会讲解运行时决议与编译时决议,穿插动静态的知识点。文章的最后我们会探讨单继承与多继承的虚表,多继承中的虚表神奇的切片指针偏移问题,这块难度较大,后续我们会考虑专门讲解一下,顺带着把钻石虚拟继承给讲了
264 1
【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表(二)
|
存储 设计模式 安全
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
|
存储 安全 Java
【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
多态即多种形态。在Linux基础IO一文中@一切皆文件,咱们说过语言上的多态是漫长软件开发过程中探索出的实现“一切皆...”的高级版本。那现在就来了解多态的语法细节。
515 0
【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
|
存储 编译器 C语言
C++多态性原理详解(静态多态、动态多态、虚函数、虚函数表)
C++多态性原理详解(静态多态、动态多态、虚函数、虚函数表)
356 0
C++多态性原理详解(静态多态、动态多态、虚函数、虚函数表)