在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数。这是由于C#的运行机制造成的,原因如下:

新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类。构造函数的执行则相反,先执行父类的,再执行本身的。

如果类包含对父类虚函数的重载,在父类构造函数中调用虚函数时,会执行函数表中继承类的虚函数,这就有问题了。

下面是个测试例子:

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 = ;
} // 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();
}
}

如果真有在构造函数中调用虚函数的必要,应将该类或该重载的虚函数设为seal,以避免被继承。

最新文章

  1. Believe Me , I Can !
  2. 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
  3. [转]RMAN检测数据库坏块
  4. 当在XP系统上无法安装Mysql ODBC时,怎么办?
  5. webservice理解
  6. datable-默认参数列表
  7. WCF 入门 (16)
  8. hive-学习笔记
  9. netty 解决TCP粘包与拆包问题(三)
  10. 《Web编程入门经典》
  11. CentOS安装Nginx安装详解
  12. javascript中通过replace函数搜索和替换指定字符串
  13. 阿里云如何添加多个网站 for Linux(绑定域名)
  14. ADO.NET程序访问数据的组件
  15. mysql中SQL执行过程详解与用于预处理语句的SQL语法
  16. golang路上的小学生系列--使用reflect查找package路径
  17. 如何清除img图片下面有一片空白
  18. SQL SERVER Management Studio
  19. 深度学习论文翻译解析(四):Faster R-CNN: Down the rabbit hole of modern object detection
  20. python自动抢票

热门文章

  1. 3DS MAX调慢摄像机动画
  2. 数的统计count(bzoj1036)
  3. python基础——迭代器
  4. NYOJ题目769乘数密码
  5. 菜鸟学Linux命令:tar命令 压缩与解压缩
  6. poj 1724:ROADS(DFS + 剪枝)
  7. Python科学计算发行版—Anaconda
  8. 总结之HashMap
  9. Ubuntu 上安装 MongoDB
  10. 浅学JSON——Json.NET之首次试手