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求深刻的解释!!!!!
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求深刻的解释!!!!!
如果是怎么结果不一样!!!!!!!!!!!
如果不是,base_c BaseObj = InObj求深刻的解释!!!!!
不是同一实例
InObj类型为 car 而car继承自 base_c类。。所以 base_c BaseObj = InObj这个等式 就是等于这样:
base_c BaseObj = (base_c)InObj 隐士的转换;;
结果是各自的 f()函数所输出的
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的非虚方法
非virtual函数根据变量类型决定。
如果是怎么结果不一样!!!!!!!!!!!
如果不是,base_c BaseObj = InObj求深刻的解释!!!!!
1、首先这两个对象,绝对是一样的。2、因为这个继承链中的f方法,不具备有多态性,使用new(覆盖) 只有用virtual才具备多态的。