class Base
{
//...
public int i = 5;
}
class Drifted : Base
{
//...
public int b = 10;
}
Base ObjectOrReference = new Drifted();
所以Base ObjectOrReference;
是对基类型的引用。
当我们写Base ObjectOrReference = new Drifted();
时,它变成了对象,因为通过使用'new'我们为它分配内存?或者它仍然引用,如果它是真的,它有什么类型?
直接问题是:“是ObjectOrReference
对象吗?”
答案 0 :(得分:12)
它仍然是一个引用,指向堆上对象的指针。它的类型为Drifted
。
即使您的引用属于Base
类型,基础对象也是Drifted
,并且将使用派生类Drifted
中的任何重写成员而不是Base
上的成员},即使您尝试使用Base
。
如果成员使用new
语法隐藏,如果您对基类型有引用,它将绕过隐藏成员的任何派生类。
可以使用Google搜索“C#参考类型”在线查看概述。我浏览了这个,看起来值得一读:
答案 1 :(得分:7)
Base ObjectOrReference = new Drifted();
通过它,您创建了一个Drifted
实例,但Base
引用变量ObjectOrReference
引用了该实例。现在它的功能仅限于Base
中可用的功能。如果您愿意,请在int b
中访问Drifted
,您必须将其投放到Drifted
答案 2 :(得分:7)
是的,ObjectOrReference
是一个对象和一个有效的对象。
它是Drifted
类型的对象。这是面向对象编程的一个基本概念,基类的指针/ ref(在你的情况下为ObjectOrReference
)可以保存/引用它的派生类(在你的情况下为Drifted
)的对象,这就是为什么它是不是错误和Drifted
类型的有效对象
答案 3 :(得分:6)
它始终是一个参考。将对象变量视为指针/引用。虽然实际的对象创建/分配发生在堆上,但是在本地堆栈空间上创建引用。
答案 4 :(得分:1)
您已实例化派生类的对象,但通过其引用其内存位置 基类引用类型(ObjectOrReference)。对象引用只知道其类型的成员(即在其基类中),并且完全不知道其派生类的成员。 因此,您无法访问派生类的成员,并且在我们讨论继承时无法在此处键入强制转换