C# C语言中的虚拟与新#
我在C#有以下课程: 运行Main函数后,我得到以下结果: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调用基函数?它是否与该函数的派生类中的“
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