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