C#中继承基类引用

4
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 是一个对象吗?”


请问您能否重新表达一下您的问题? - FIre Panda
基本上,我被问到“ObjectOrReference”是引用还是对象?据我理解,它同时是“Drifted”类的引用和有限对象。所谓有限,是指它只能访问在“Base”中定义的成员。 - Nikita
5个回答

12

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

即使你的引用是Base类型,底层对象也是Drifted,对于派生类Drifted中的任何重写成员,都会使用它们而不是Base中的成员,尽管你尝试使用Base

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

可以在Google上搜索“C#引用类型”来了解概述。我粗略地浏览了一下,看起来值得阅读:

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


为什么我可以给 'ObjectOrReference.i' 赋值,如果 'ObjectOrReference' 不是对象,那堆中的对象叫什么名字? - Nikita
@Nikita是Base类型的成员。使用ObjectOrReference本地变量,您无法看到Drifted.b,您需要转换为Drifted才能看到它。 - Adam Houldsworth
1
@Nikita C# 隐藏了它实际上指向堆上的内存位置这一事实。C# 引用会自动为您解析到对象,而在 C++ 中,您需要自己解析指针。 - Adam Houldsworth

7
Base ObjectOrReference = new Drifted();

有了这个,您已经创建了一个Drifted实例,但是由Base引用变量ObjectOrReference引用。现在它的功能只限于Base中可用的功能。如果想要访问Drifted中的int b,则需要将其转换为Drifted


7
是的,ObjectOrReference 是一个对象并且是一个有效的对象。
它是一个 Drifted 类型的对象。这是面向对象编程的基本概念,即基类(ObjectOrReference 在这种情况下)的指针/引用可以持有/引用它的派生类(Drifted 在这种情况下)的对象,因此它不是一个错误,并且是一个有效的 Drifted 类型的对象。

6

它始终是一个引用。把对象变量看作指针/引用。虽然实际的对象创建/分配发生在堆上,但引用被创建在本地堆栈空间上。


1
你已经实例化了一个派生类的对象,但是通过它的基类引用类型(ObjectOrReference)引用其内存位置。对象引用仅知道其类型的成员(即在其基类中),完全不知道其派生类的成员。因此,你无法访问派生类的成员,在这里也无法进行类型转换,因为我们正在谈论继承。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接