由虚方法谈到实例在编译和运行时的类型
2009-01-02 15:36
204 查看
今天想温故而知新,想更彻底的了解下虚方法,估计大多数人跟我一样对虚方法很多的认识仅在于---------------------方法名前有virtual修饰的就被称为虚方法,无virtual修饰的方法称为非虚方法.
虚方法与非虚方法有啥区别呢?其实很关键的一点就是-----------------------在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法调用中,相关的实例的编译时类型是决定性因素。
那么实例在编译和运行时的类型分别是什么呢?eg A a= new B();____A,B都为一个类.那么a实例在编译时候的类型就是A,而运行时候的类型就为B.
Eg:
using System;
class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class Test
{
static void Main() {
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}
那么输出结果就是A.F B.F B.G B.G
虚方法与非虚方法有啥区别呢?其实很关键的一点就是-----------------------在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法调用中,相关的实例的编译时类型是决定性因素。
那么实例在编译和运行时的类型分别是什么呢?eg A a= new B();____A,B都为一个类.那么a实例在编译时候的类型就是A,而运行时候的类型就为B.
Eg:
using System;
class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class Test
{
static void Main() {
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}
那么输出结果就是A.F B.F B.G B.G
相关文章推荐
- Java编译时类型与运行时类型以及重载和覆盖方法选择
- 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法
- 【Java学习】java实例对象的编译时类型和运行时类型
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- vs2005 编译程序无法运行解决方法
- C#中的运行时类型与编译时类型
- 指定动态库.so编译运行搜索路径方法
- C#编译错误实例及解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法 2012-2-16 11:08
- Properties的使用实例:限制方法运行次数
- 黑马--程序员 总结:多态变量,在编译和运行期间,都参考的是左边(引用类型所属的类)
- VS2013编译运行常见错误及解决方法
- AS3 判断某个类型(注意:不是实例)是否继承于某个类型的方法
- [VC]在VC++中实现让程序只运行一个实例的方法且实现该实例
- java中带包的源文件编译与运行方法
- 解决C# WINFORM程序只允许运行一个实例的几种方法详解
- 让程序只运行一个实例的四种方法
- 在linux环境下编译运行OpenCV程序的两种方法 - woshijpfgg
- codeblocks中cocos2dx项目添加新的.cpp和.h文件后编译运行的方法