超类构造函数中的虚拟化

2023-12-04

我认为根据 OOP 的设计,虚拟化在超类构造函数中不起作用。例如,请考虑以下 C# 代码。

using System;
namespace Problem
{
    public class BaseClass 
    {
        public BaseClass() 
        {
            Console.WriteLine("Hello, World!");
            this.PrintRandom();
        }
        public virtual void PrintRandom() 
        {
            Console.WriteLine("0");
        }
    }

    public class Descendent : BaseClass 
    {
        private Random randomValue;
        public Descendent() 
        {
            Console.WriteLine("Bonjour, Monde!");
            randomValue = new Random();
        }
        public override void PrintRandom() 
        {
            Console.WriteLine(randomValue.NextDouble().ToString());
        }

        public static void Main() 
        {
            Descendent obj = new Descendent();
            obj.PrintRandom();
            Console.ReadLine();
        }
    }
}

此代码会中断,因为当创建 Descendent 对象时,它会调用基类构造函数,并且我们在基类构造函数中调用了一个虚方法,该虚方法调用又调用了派生类的方法,因此它崩溃了,因为那时 randomValue 尚未初始化。

类似的代码在 C++ 中工作,因为对 PrintRandom 的调用不会路由到派生类,因为 IMO,C++ 中的顺序类似于:


1. 调用基类构造函数
2. 更新 V - 此类的表
3.调用构造函数代码

我的问题是,首先我是否正确,根据 OOP 原则,虚拟化不应该/不能在超类构造函数中工作,其次如果我是对的,那么为什么所有 .NET 语言的行为都不同(我有使用 C#、VB.NET 和 MC++ 进行了测试)


在本机 C++ 中,程序按预期工作:您可以在基类构造函数中调用基类版本的虚函数。在构造函数调用时,仅存在基类及其虚函数,因此您获得当时定义的虚函数的最低级别版本。这并不意味着不能使用虚拟化,只是您不会在基类的构造函数中获得虚拟方法的子类版本(这就是不推荐的原因)。

显然,正如您所看到的,托管代码的工作方式不同,因为 (iirc) 整个对象是在调用构造函数之前构建的,因此您在子类构造函数之前获得子类虚函数。这是语言行为之间的记录差异,但在 .NET 语言之间应该保持一致(因为它们都编译为相同的 IL)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超类构造函数中的虚拟化 的相关文章

  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • .Net 4.0 应用程序在 64 位上比 32 位慢(分析和可能的解决方案)(应用程序正在使用 NetAdvantage)

    我们已经用 VB NET 4 0 VS2010 编写了 NET 应用程序 并使用设置为调试和发布配置的 AnyCPU 设置的所有项目进行编译 我们注意到 当此应用程序在 64 位环境中运行 在 Windows Server 2003 R2
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • plpgsql - 在声明语句中使用动态表名

    我正在尝试编写 plpgsql 一个以下形式的函数 注意这是一个简化版本 CREATE FUNCTION check valid tablename regclass RETURNS boolean AS DECLARE valid row
  • css3 比例周围的空白

    我有一个小问题想要解决 但找不到任何好的答案 当我在 div 包含其他 div 上使用比例时 它会在 div 的 原始 宽度和高度周围留下空白 如何在缩放时删除 div 周围的空白 如果需要的话我可以使用js 编辑 这是一些代码 HTML
  • 为什么 lea 指令只是执行算术运算,却以内存寻址命名? [复制]

    这个问题在这里已经有答案了 The lea指令 加载有效地址 获取第一个值的内存地址并将其与第二个值相加 第二个值可能会相乘 然后它将该内存地址加载到给定的寄存器中 我举个例子来澄清一下我的困惑 eax 2 leal eax eax 4 e
  • iOS7.0 和 iOS 7.1 不支持动态桌面视图高度

    我在 UITableViewCell 的各种实现中使用了自动布局 该方法是让固有大小定义大小 进而为 tableview 行提供高度 奇怪的是 在 UITableViewCell 中使用 Autolayout 来定位 iOS7 及更高版本并
  • Android SENSOR_DELAY_FASTEST 不够快

    我正在使用传感器来平衡机器人 但是SENSOR DELAY FASTEST只提供10Hz的采样率 这根本不够快 有没有更快的采样方法 有没有一种方法可以轮询传感器而不是等待SensorEvent 有没有更快的采样方法 SENSOR DELA
  • bash - 如何获取(当前)儒略日数?

    如何获得今天的儒略日数 JDN 相等的 或者任何日期 我看了又看 但只发现了一些产生 year dayOfYear 的函数 而不是类似 2457854 in bash date j返回儒略日期 root TX Serv 1 date j 1
  • 如何在 ASP.NET 中从 Exchange Web 服务托管 API 2.0 更新约会

    我使用 EWS 托管 API 2 0 创建约会 效果很好 但也想更新现有的约会 我读到我需要预约 ID 来指定应编辑哪个预约 但是身份证在哪里呢 这是我创建约会的方法 Creates the Appointment Dim appointm
  • Koha RESTful api

    我一直在互联网上查找有关 Koha ILS Restful api 的信息 但没有找到任何具体信息 这个链接讨论了它的 HTTP API http wiki koha community org wiki Koha svc HTTP API
  • d3.js-向堆积条形图中的一个条形添加不同的颜色

    我使用 d3 js 创建了堆积条形图 我想显示一个具有不同颜色的条形图 以突出显示特定 x 轴值的数据 如下所示 我用来绘制堆积图的脚本如下 Set the dimensions of the canvas graph var svg d3
  • 如何在R中的关键字前添加逗号?

    我目前有一个城市的数据框 向量 其末尾有以以下任何一个开头的单词 Util Municipal Police Water 或末尾有 如何前往 Col City of Fake Municipal Court City of Pretend
  • 安装依赖项时composer-plugin-api错误

    我正在尝试为我正在处理的现有 Symfony 项目安装依赖项 我看了这个https getcomposer org doc 01 basic usage md composer lock the lock file它说我应该运行更新命令 p
  • 独立 EJB 客户端需要哪些 JBoss 5.1 库?

    我正在从 JBossAS 4 05 迁移到 JBoss 5 1 并且我对需要在 EJB 独立客户端中更改哪些库有疑问 从 JBossAS 4 0 5 开始 我有一个需要在所有客户端中部署的库的直接列表 但是 在 5 1 版本中 一些库被更改
  • 一页多个ajax请求+如何做+最佳实践

    我现在正在研究谷歌图表 并且已经有了一个基本的设置 它目前所做的是连接到数据库并返回基于 1 个查询的数据集 我想知道的是 如果我想用不同的数据库查询绘制更多图表 我该怎么做 或者什么是最佳实践 例如 已经有一个与一个查询的连接 如何添加另
  • MATLAB 舍入函数 - 如何向上或向下舍入 0.5?

    MATLAB 的舍入函数如何与 5 一起使用 比如5 5 是向上舍入到 6 还是向下舍入到 5 Mathworks 页面讨论这个函数没有提到这一点 这个例子也没有帮助 以下是 MATLAB 舍入函数的 mathworks 页面 mathwo
  • 从 Java 代码生成 Maven 原型

    我想知道是否可以在Java代码中运行maven命令 archetype generate 我已经使用 Maven 嵌入器尝试过此操作 但该库已被弃用 我想做一个原型 从远程目录生成 并捕获原型所需的属性 我想要运行的maven命令例如是 m
  • 可以在 R 中使用 gganimate 对多边形填充进行动画处理吗?

    I have county level data recording the year an invasive insect pest was first detected in that county between 2002 and 2
  • 旧的 IN 与 Exists 与 Left Join(其中 ___ 为或不为空);表现

    我发现自己陷入了困境 我的表只有一列 抑制或包含列表 或多或少是 varchar 25 但问题是在主查询中使用它们之前我没有时间对它们进行索引 并且取决于它的重要性 我不知道每个表中有多少行 所有这一切的核心基表大约有 140 万行和大约
  • 在Java程序中运行Logstash

    我已经在 ElasticSearch 中创建了索引和字段 我可以使用以下命令成功运行 Logstash 配置文件 将 MySQL 数据库表中的数据添加到 ElasticSearch 中 bin logstash f PATH TO LOGS
  • 希望通过 MYSQL 提取字符串中括号之间的数据

    有人可以帮忙吗 我一直在搜索并遇到 修改了这段代码 结果得到 1 或 0 之间有的话为 1 没有的话为 0 我想找出他们之间到底是什么 而不是是否有什么 因此 如果我在字段中有一个如下所示的字符串 ABC 989 Hello 当前我得到 1
  • 超类构造函数中的虚拟化

    我认为根据 OOP 的设计 虚拟化在超类构造函数中不起作用 例如 请考虑以下 C 代码 using System namespace Problem public class BaseClass public BaseClass Conso