继承基类引用C#

时间:2011-05-17 13:24:21

标签: c# inheritance reference base-class

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对象吗?”

5 个答案:

答案 0 :(得分:12)

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

即使您的引用属于Base类型,基础对象也是Drifted,并且将使用派生类Drifted中的任何重写成员而不是Base上的成员},即使您尝试使用Base

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

可以使用Google搜索“C#参考类型”在线查看概述。我浏览了这个,看起来值得一读:

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

答案 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)。对象引用只知道其类型的成员(即在其基类中),并且完全不知道其派生类的成员。 因此,您无法访问派生类的成员,并且在我们讨论继承时无法在此处键入强制转换