Nex*_*tep 9 .net oop inheritance derived-class
我已经是一名.Net编码员(不能说我是程序员)2年了.有一个问题我多年来都无法理解,那就是基类的实例如何能够保存派生类的实例?
假设我们有两个类:
class BaseClass
{
public A propertyA;
public B propertyB;
}
class DerivedClass ?BaseClass
{
public C propertyC;
}
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种情况:
BaseClass obj = new DerivedClass ()
Run Code Online (Sandbox Code Playgroud)
我的意思是,内存模型BaseClass没有空间用于新添加的propertyC,那么它怎么能保持propertyC的值呢?
另一方面,这怎么可能不会发生:
DerivedClass obj = new BaseClass()
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的方法,因为内存模型DerivedClass具有BaseClass的所有空间甚至更多.但事实并非如此,为什么呢?
我知道我问的是一个非常愚蠢的问题,但有人可以给我一个更详细的答案吗?从内存或编译器的角度来看会更好.
因为(并且这个概念经常被误解),保存指针的变量与它指向的对象的实际具体类型无关.
所以当你写作
BaseClass obj = new DerivedClass ()
Run Code Online (Sandbox Code Playgroud)
所说的部分在Stack上BaseClass obj创建一个新的引用变量,编译器理解该引用变量以保存对某个或来自的东西的引用BaseClass.
读取的部分= new DerivedClass ()实际上创建了一个新的类型对象DerivedClass,将其存储在Heap上,并将指向该对象的指针存储在指向的内存位置obj.堆上的实际对象是 DerivedClass ; 这被称为对象的具体类型.
变量obj声明为类型BaseClass.这不是具体类型,它只是一个变量类型,它只限制编译器将地址存储到指向不是BaseClass或不从该类型派生的对象的变量中BaseClass.
这样做是为了保证无论你投入obj变量,不管它是一个具体类型BaseClass或者DerivedClass,它会拥有所有的方法,属性和类型的其他成员BaseClass.它告诉编译器obj应该将变量的所有使用限制为仅使用该类的那些成员BaseClass.
由于BaseClass是引用类型,obj因此不是BaseClass对象。它是对对象的引用BaseClass。具体来说,它是对的BaseClass一部分的引用DerivedClass。