2011-05-17 104 views
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对象?”继承基类参考C#

+0

你能否重新说明你的问题? – 2011-05-17 13:28:34

+0

基本上我被问到'ObjectOrReference'引用OR对象吗?据我了解,它同时引用和受限制的“Drifted”类的对象,我的意思是它只能访问'Base'中定义的成员。 – Nikita 2011-05-17 13:50:07

回答

12

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

即使你的参考是Base类型,底层对象是并在派生类任何重写的成员将被用来代替那些Base,即使你试图使用Base

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

可以通过谷歌搜索“C#参考类型”在线查找概述。我脱脂这一点,看起来像一个值得读:

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

+0

为什么我可以为'ObjectOrReference.i'赋值如果'ObjectOrReferenc'不是对象,堆中的对象名称是什么。 – Nikita 2011-05-17 13:29:25

+0

@Nikita,因为那是'Base'类型的成员。使用'ObjectOrReference'局部变量你看不到'Drifted.b',你需要转换为'Drifted'来看看。 – 2011-05-17 13:32:08

+1

@Nikita C#隐藏了它实际上指向堆上的内存位置的事实。 C#引用会自动解析为对象,而在C++中则需要自己解析指针。 – 2011-05-17 13:34:12

7
Base ObjectOrReference = new Drifted(); 

用,你已经创建了一个实例,但由Base参考变量ObjectOrReference引用。目前它的功能仅限于Base中提供的功能。如果你想要访问int b在,你必须将它投到

6

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

7

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

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

1

您已经实例化派生类的对象,但通过其基本类引用类型(ObjectOrReference)引用其内存位置。对象引用仅知道其类型的成员(即在其基类中),并完全不知道其派生类的成员。 所以你不能访问派生类的成员,因为我们在谈论继承问题,所以你不能在这里输入cast