4
class Base
    {
        //...
        public int i = 5;
    }

class Drifted : Base
{
    //...
    public int b = 10;
}

Base ObjectOrReference = new Drifted();

Base ObjectOrReference;对基本类型的引用也是如此。当我们写Base ObjectOrReference = new Drifted();它时,它变成了对象,因为通过使用“新”我们为它分配内存?或者它仍然引用,如果它是真的,它有什么类型?直接的问题是:“是ObjectOrReference对象吗?”

4

5 回答 5

12

它仍然是一个引用,一个指向堆上对象的指针。它是类型Drifted

即使您的引用属于该Base类型,基础对象也是Drifted,并且派生类中的任何覆盖成员Drifted都将被使用而不是那些 on Base,即使您正在尝试使用Base.

在使用new语法隐藏成员的情况下,如果您有对基类型的引用,它将绕过任何隐藏成员的派生类。

可以使用谷歌搜索“C# 引用类型”在线找到概述。我略读了这个,看起来值得一读:

http://www.albahari.com/valuevsreftypes.aspx

于 2011-05-17T13:27:18.637 回答
7
Base ObjectOrReference = new Drifted();

这样,您已经创建了一个Drifted实例,但被Base引用变量引用ObjectOrReference。目前,它的功能仅限于Base. 如果你想,说 access int bin Drifted,你必须把它投射到Drifted

于 2011-05-17T13:28:17.147 回答
7

是的,ObjectOrReference是一个对象和一个有效的对象。

它是一个Drifted类型的对象。这是面向对象编程的一个基本概念,基类的指针/引用(ObjectOrReference在你的情况下)可以保存/引用它的派生类的对象(Drifted在你的情况下),这就是为什么它不是错误和Drifted类型的有效对象

于 2011-05-17T13:31:17.713 回答
6

它一直是参考。将对象变量视为指针/引用。虽然实际的对象创建/分配发生在堆上,但引用是在本地堆栈空间上创建的。

于 2011-05-17T13:28:19.163 回答
1

您已实例化派生类的对象,但通过其基类引用类型 (ObjectOrReference) 引用其内存位置。对象引用只知道其类型的成员(即在其基类中)并且完全不知道其派生类的成员。因此,您不能访问派生类的成员,也不能在此处键入 cast,因为我们正在讨论继承

于 2012-07-13T10:24:06.573 回答