博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 构造函数中调用虚函数
阅读量:5741 次
发布时间:2019-06-18

本文共 2055 字,大约阅读时间需要 6 分钟。

using System;using System.Diagnostics;using System.Text;using System.Collections;using System.Collections.Generic;class Test{    public class Base    {        public Base()        {            System.Console.WriteLine("Base.Base");            ABitDangerousCall();        }        public virtual void ABitDangerousCall()        {            System.Console.WriteLine("Base.ABitDangerousCall");        }        private class Inner        {            public Inner()            {                System.Console.WriteLine("Base.Inner.Inner");            }        }        private Inner inner = new Inner();    }    class Derived : Base    {        public Derived()        {            System.Console.WriteLine("Derived.Derived");            ctorInitializedMember = 5;        }        // ctorInitializedMember is default initialized to zero before the constructor initializes it.        private int ctorInitializedMember;        private int derivedInt;        public override void ABitDangerousCall()        {            System.Console.WriteLine(String.Format("Derived.ABitDangerousCallctorInitializedMember={0} derivedInt={1}", ctorInitializedMember, derivedInt));        }        private class Inner        {            public Inner()            {                System.Console.WriteLine("Derived.Inner.Inner");            }        }        private Inner inner = new Inner();    }    class Program    {        static void Main(string[] args)        {            Derived d = new Derived();            Console.Read();        }    }}

输出结果:

Derived.Inner.Inner

Base.Inner.Inner
Base.Base
Derived.ABitDangerousCallctorInitializedMember=0 derivedInt=0
Derived.Derived

由于实例构造函数的调用顺序是先基类构造函数再子类构造函数,如上面例子,在基类中调用被子类重写了的虚函数ABitDangerousCall时,实际会调用子类的ABitDangerousCall,

该函数中使用了变量ctorInitializedMember,但此时子类的构造函数还没调用,故ctorInitializedMember未被赋值,这样就出现了不想看到的结果。我们本来是想想看到ctorInitializedMember=5的结果,结果却是0。

因此在基类的构造函数中调用虚函数是很危险的,项目大了代码复杂了就很容易造成极隐蔽的BUG。同时在子类的构造函数中调用虚函数也是要小心的,尽量避免,原因同上。

如果非要调用,那就要细心察看虚函数中的变量是否已经全部在前面处理妥当了

转载于:https://www.cnblogs.com/timeObjserver/p/6055300.html

你可能感兴趣的文章
mcrypt启用 加密以及解密过程详细解析
查看>>
GO study
查看>>
最完美ThinkPHP nginx 配置文件
查看>>
干净虚拟机(centos 6.4)上从头到尾安装并调试Mdrill(一)
查看>>
如何在eclipse中配置反编译工具JadClipse
查看>>
Oracle 取随机数
查看>>
布局文件打开时不为代码界面时的解决方法
查看>>
MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题
查看>>
httpd.conf文件详解(上)
查看>>
javascript之DOM基本操作(w3c标准)
查看>>
用JDBC查询学生成绩单
查看>>
SpringCloud拦截器使用(Interceptors拦截器使用)
查看>>
基于OSSIM平台的信息系统安全风险评估实施指南
查看>>
java匿名类的使用
查看>>
CentOS7安装Jenkins(稳定版)
查看>>
JDBC--使用DatabaseMetaData获取数据库信息
查看>>
makefile(三)使用命令
查看>>
AC AP
查看>>
[日推荐] 『忆年共享相册』-照片鉴证一起走过的哪些年
查看>>
Tomcat Session 共享 方法
查看>>