using System;
namespace Wrox.ProCSharp.Basics1
{
class abs
{
class base_c
{
public void f()
{ Console.WriteLine("调用了基类BaseClass的非虚方法"); }
}class car : base_c
{
new public void f()
{ Console.WriteLine("调用了派生类InClass的非虚方法"); }
}
static void Main()
{
car InObj = new car();
base_c BaseObj = InObj;
BaseObj.f();
InObj.f();
Console.ReadLine();
}
}
}
BaseObj ,InObj 是同一实例?
如果是怎么结果不一样!!!!!!!!!!!
如果不是,base_c BaseObj = InObj求深刻的解释!!!!!

解决方案 »

  1.   

    BaseObj ,InObj 是同一实例?
    如果是怎么结果不一样!!!!!!!!!!!
    如果不是,base_c BaseObj = InObj求深刻的解释!!!!!
    不是同一实例
    InObj类型为 car 而car继承自 base_c类。。所以 base_c BaseObj = InObj这个等式 就是等于这样:
    base_c BaseObj = (base_c)InObj 隐士的转换;;
    结果是各自的 f()函数所输出的
      

  2.   

    类型隐式转换。car InObj = new car();//new 一个 car 对象
    base_c BaseObj = InObj;//隐式转换为base_c对象
    BaseObj.f();//调用base_c的f方法
    InObj.f();//调用inOb的f方法
    base_c BaseObj = InObj  与 base_c BaseObj = (base_c)InObj 等同。因此结果为:
    调用了基类BaseClass的非虚方法
    调用了派生类InClass的非虚方法
      

  3.   

    BaseObj ,InObj 当然是同一实例,但c#调用方法不一定和实例有关,其实调用非虚方法时,c#并不检查BaseObj、InObj引用的实例是什么类型,c#会直接根据BaseObj、InObj的类型,在编译时就决定调用哪个方法,c#会用typeof(BaseObj)找到要调用的f方法,而根本不检查实例,
      

  4.   

    指向的是同一个实例,结果不同是因为 变量的类型不同。virtual函数根据实例类型决定调用哪个函数。
    非virtual函数根据变量类型决定。
      

  5.   

    BaseObj ,InObj 是同一实例?
    如果是怎么结果不一样!!!!!!!!!!!
    如果不是,base_c BaseObj = InObj求深刻的解释!!!!!
    1、首先这两个对象,绝对是一样的。2、因为这个继承链中的f方法,不具备有多态性,使用new(覆盖)   只有用virtual才具备多态的。