2 weixin 39488821 weixin_39488821 于 2017.09.08 12:52 提问

新手求问关于继承的问题
abstract class Person
{
    public string Name { get; set; }
    public Person()
    {
        SetName();
    }
    public abstract void SetName();
}
class Student : Person
{
    public override void SetName()
    {
        Name = "ssss";
    }
}

小弟想知道,当 Student s  = new Student(); 的时候,

执行到 Name="ssss" 这句话时,这个 Name 是 父类的 还是 子类继承过来的Name?
感觉这里写 this.Name, base.Name,或者直接写  Name,是不是没区别啊?如果有区别,区别在哪里呢?请大神赐教

3个回答

caozhy
caozhy   Ds   Rxr 2017.09.08 12:53
已采纳

类继承过来的,就是基类的,这两者是一回事。在内存中,只有一份。

weixin_39488821
weixin_39488821 大哥再问下,一份,是指栈和堆都一样,还是只是堆一样?
2 个月之前 回复
caozhy
caozhy   Ds   Rxr 2017.09.08 12:54

另外,不要在基类构造函数里调用虚函数,这样做会造成不可预料的结果。这是一个坏习惯。

weixin_39488821
weixin_39488821 谢谢您啊!才知道只有一份
2 个月之前 回复
summergo123321
summergo123321   2017.09.08 13:04

其实继承这个问题如果真的完完全全按照现实父子关系是不相符的,所以你猜有这个疑问。
父亲和儿子,在现实中是两个人,但在编程里是一个,这是翻译问题,所以你会发现,很多语言对父类方法用单词用base,super而不用father。基类和派生类才是最贴切叫法,他们根本不是现实中父子关系这种关系,实例后他们是一个东西,比如基类你,和派生类是当司机的你,当火车司机的你,但无论怎么派生你是你自己,比如基类你有个名字属性,就算到最后高大上到你能开飞机,但你的名字属性还是统一个,不存在是基类的还是派生类的。

summergo123321
summergo123321 回复热敷哥: 基类这个相当贴切,打地基盖楼,盖完一层盖二层,盖到18层,一层的变量还在一层住着来没动过,而不是到盖二楼了再复制一份成两个1层了,不过会被重新装修(虚函数重构)。
2 个月之前 回复
weixin_39488821
weixin_39488821 当代白居易啊!通俗易懂
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片