Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的虚拟与新#_C#_.net_Virtual - Fatal编程技术网

C# C语言中的虚拟与新#

C# C语言中的虚拟与新#,c#,.net,virtual,C#,.net,Virtual,我在C#有以下课程: 运行Main函数后,我得到以下结果: Derived Via Base Reference Derived.DoSomethingVirtual Base.DoSomethingNonVirtual Derived Via Derived Reference Derived.DoSomethingVirtual Derived.DoSomethingNonVirtual 为什么baseRef.dosoemthinnovirtual调用基函数?它是否与该函数的派生类中的“

我在C#有以下课程:

运行Main函数后,我得到以下结果:

Derived Via Base Reference
Derived.DoSomethingVirtual
Base.DoSomethingNonVirtual

Derived Via Derived Reference
Derived.DoSomethingVirtual
Derived.DoSomethingNonVirtual
为什么baseRef.dosoemthinnovirtual调用基函数?它是否与该函数的派生类中的“new”关键字有关? 我理解“虚拟”和“覆盖”的重要性。我的困惑是由以下陈述引起的:
BaseClass BaseRef=新的DerivedClass()

如果您定义了一个
virtual
方法,并且在派生类中覆盖了它,那么该方法将在所有级别上都具有覆盖行为。基类将使用派生方法。这就是为什么覆盖方法大部分时间都在内部调用其基本实现的原因

使用
new
可以定义一个同名的方法,而不是更多

基类不知道这个方法,所以不会调用它

为什么BaseRef.dosoemthinnovirtual调用基函数

这是你的声明:

BaseClass BaseRef = new DerivedClass();
在这里,您创建一个类型为
DerivedClass
的对象,并将其引用分配给类型为
BaseClass
的变量。这是因为
DerivedClass
的基本类型是
BaseClass

那么这里

BaseRef.DoSomethingNonVirtual
您可以调用方法
DoSomethingNonVirtual

BaseRef
的类型是什么

它是
基类
。因此将调用此类的方法,而不是
DerivedClass
的方法

因此,这里的问题是您创建了一个类型为
DerivedClass
的对象,并将该对象的引用分配给了类型为
BaseClass
的变量。 所以当CLR第一次看到这个调用时

BaseRef.DoSomethingNonVirtual
必须解析
BaseRef
的类型,然后查看对象的方法表,选择相应的IL,最后生成相应的本机代码。CLR将如何解决此问题?作为
BaseClass
类型的对象,而不是
DerivedClass

为什么baseRef.DoSomethingNonVirtual调用基函数

因为
baseRef
的编译时类型是
BaseClass
,所以方法调用被解析为
BaseClass.DoSomethingNonVirtual()
baseRef
引用的对象的实际类型是
DerivedClass
,但编译器不知道它


此方法不是虚拟的,因此在运行时调用它时,CLR只需调用
基类
实现。

此处的
新建
的唯一效果是抑制警告。
BaseRef.DoSomethingNonVirtual