base 关键字

转帖|其它|编辑:郝浩|2009-03-03 10:34:40.000|阅读 551 次

概述:揭秘 base 关键字

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

在C++语言中,this一惯都称为“this指针”,为了简洁统一起见,姑且都称之为“指针”罢。

     既然讲到this了,顺便说说base关键字,大家可能注意到,我称之为“base关键字”,而不叫“base指针”之类的叫法,我们一般会想当然认为,this是一个指向某个对象的引用的话,base应该是指向某个对象的基类的引用。

     而事实上,一个实例化后的对象在内存中是不存在所谓的对象的基类的,也根本不可能有哪个引用可以指向“某个对象的基类”。

     比如 object o = this; 是合法的,object o = base; 编译器会毫不客气得告诉你:不行!

     再比如:bool b = this == null; 是合法的,bool b = base == null; 同样不行。

     那么,base是什么。

     下面就是见证事实的时刻。

     首先编译下面的代码:

class Program
{
    
static void Main(string[] args)
    {
        MyClass myobject 
= new MyClass();
        myobject.Method();
    }
    
class MyClass : MyObject1
    {
        
public override void Method()
        {
            
this.Method();
            
base.Method();
        }
    }
    
class MyObject1 : MyObject0
    {
        
public override void Method()
        {
            
base.Method();
        }
    }
    
class MyObject0
    {
        
public virtual void Method()
        {
            
        }
    }
}

      不管这段代码会产生什么样的运行效果,来看MyClass的Method方法编译后的结果:

.method public hidebysig virtual instance void Method() cil managed
{
    
.maxstack 8
    
L_0000: nop 
    
L_0001: ldarg.0 //this指针
    L_0002: callvirt instance void Program/MyObject0::Method()
    
L_0007: nop 
    
L_0008: ldarg.0 //this指针
    L_0009: call instance void Program/MyObject1::Method()
    
L_000e: nop 
    
L_000f: ret 
}

     可以看到,两种方法调用时都传入了this指针,而不同的是:

     this方式调用,是以晚绑定的方式调用虚方法(无论在哪里出现都是调用虚方法,而不是该类重写后的方法,而真正调用哪个方法在运行时确定)。

     base方式调用,则是直接调用他的基类的方法。

     以上的这一切都是由编译器为我们所做的工作。

     很显然,可以得出这样的结论:base关键字告诉编译器,放弃多态,直接调用基类的方法。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP