![]() |
1
4
在本机C++中,程序按照预期工作:您可以调用基类构造函数中的虚函数的基类版本。在构造函数调用时,只有基类及其虚拟函数存在,因此您可以获得当时定义的虚拟函数的最低级别版本。这并不意味着不能使用虚拟化,只是在基类的构造函数中无法获得虚拟方法的子类版本(这就是为什么不建议使用虚拟化)。 显然,正如您所看到的,托管代码的工作方式不同,因为(iirc)整个对象是在调用构造函数之前构建的,因此您在子类构造函数之前获得子类虚函数。这是两种语言行为之间的差异,但在.NET语言中应该是一致的(因为它们都编译为相同的IL)。 |
![]() |
2
3
在我看来,这不是OO原则的问题——这取决于所讨论的平台如何处理这一特殊难题。然而,正是由于这个原因,不鼓励从构造函数调用虚拟方法——如果要这样做,需要编写文档 非常
Java采用与.NET相同的方法
除了
在C#中,任何实例变量初始值设定项都是在进行基本构造函数调用之前执行的。这意味着在您的特定示例中,您可以通过初始化来修复代码
至于为什么++ 这样做,我不知道-我建议您比较生成的IL。我的猜测是,它显式地进行非虚拟方法调用。 编辑:我怀疑我误读了这个问题-MC++以哪种方式工作?如果它像C#那样工作,在我看来这是一件好事,可以在整个.NET平台上提供一致的视图。 |
![]() |
3
0
我建议在代码中使用FxCop。我和许多人一起工作过,他们认为这个工具提出的问题无关紧要,但是,如果你的代码包含很多小问题(比如你的),那么被一个或多个问题咬伤的可能性就要大得多。 ReSharper的代码分析也会发现这个特殊的问题。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 3 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 3 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 3 月前 |