继承基类引用C#

Nik*_*ita 4 c# inheritance reference base-class

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

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

Base ObjectOrReference = new Drifted();
Run Code Online (Sandbox Code Playgroud)

所以Base ObjectOrReference;是对基类型的引用.当我们写Base ObjectOrReference = new Drifted();它成为对象因为使用'new'我们为它分配内存?或者它仍然引用,如果它是真的,它有什么类型?直接的问题是:"是ObjectOrReference对象吗?"

Ada*_*rth 12

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

即使您的引用属于Base类型,底层对象也是如此,即使您尝试使用,也将使用Drifted派生类中的任何重写成员Drifted而不是其他成员.BaseBase

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

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

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


Bal*_*a R 7

Base ObjectOrReference = new Drifted();
Run Code Online (Sandbox Code Playgroud)

有了它,你已经创建了一个Drifted实例,但是被Base引用变量引用ObjectOrReference.现在它的功能仅限于可用的功能Base.如果你想,说,访问int bDrifted,你必须将它转换为Drifted


Har*_*san 7

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

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


d-l*_*ive 6

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