A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ┾——黑马 中级黑马   /  2013-9-25 10:06  /  4690 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ┾——黑马 于 2013-9-25 17:10 编辑

网上有的人说是继承过来了,有的人说没有!我是这样理解的,如果单从这些私有成员在子类有没有分配内存空间来说,的确是继承过来了!如果是从面向的角度来说,继承过来的目的就是为了多态,代码重用的角度来说,继承过来了不能够使用来说,又没有继承!大家是什么观点?

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

7 个回复

倒序浏览
子类虽然访问不了父类的私有变量,但是可以通过方法访问  不能继承父类的私有成员

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
不继承,私有成员只属于当前类
回复 使用道具 举报
用private修饰的成员,子类是无法继承的。
子类是继承了父类,但如说是也继承了父类的私有成员,却不能使用,我认为这样是不对的。
因为继承是有意义的,如果继承了父类的成员,却不能使用,那怎么算是继承呢?所以说子类继承了父类的私有成员这样的说法是不合理的。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
我觉得是继承过来了,子类实例化后给通过父类的公共属性给父类的私有字段赋值,取值,调试时发现在内存中私有字段也是开辟了空间的,下面是测试代码,有错误的地方请多多指教
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 继承测试
{
    class Program
    {
        static void Main(string[] args)
        {
            Zi a = new Zi();
            a.Say();
            a.A = 100;//设置父类a属性
            Console.WriteLine(a.A);//获取父类a属性
            Fu f = a;
            f.Say();
            Console.ReadKey();
        }
    }
    class Fu
    {
        private int a;

        public int A
        {
            get { return a; }
            set { a = value; }
        }
        public void Say()
        {
            Console.WriteLine("父类公共方法");
        }
        private void SiYou()
        {
            Console.WriteLine("父类私有方法");
        }
    }
    class Zi:Fu
    {
        private int a;

        public int A1
        {
            get { return a; }
            set { a = value; }
        }
        private void SiYou()
        {
            Console.WriteLine("我是子类私有方法");
        }
        new public void  Say()
        {
            Console.WriteLine("我是子类公共方法");
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
按照准确的来说,在C#.NET中子类是继承父类的所有属性和方法,包括私有的(private),只是在子类中不能被访问而已,但是在使用时我们不考虑私有的是否被继承。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
在C#.NET中子类是继承父类的所有属性和方法,包括私有的(private),只是在子类中不能被访问而已。这里涉及到一个概念VTM(虚拟方法表),一个类的所有方法都会在VTM中,包括继承自父类的私有方法,只是不能访问。给你个例子你就会发现父类中的私有字段是可以继承的:
  1. class Base
  2.     {
  3.         private int m = 2;
  4.         public int GetM(Child c)
  5.         {
  6.             return c.m;
  7.         }

  8.         public int GetM(Base b)
  9.         {
  10.             return b.m;
  11.         }

  12.         public Base()
  13.         { }

  14.         public Base(int m)
  15.         { this.m = m; }
  16.     }

  17.     class Child : Base
  18.     {
  19.         private int m = 1;
  20.         public new int GetM(Child c)
  21.         {
  22.             return c.m;
  23.         }

  24.         public Child(int m)
  25.             : base(m)
  26.         { this.m = 4; }
  27.     }

  28.     class test
  29.     {
  30.         public static void Main()
  31.         {

  32.             Base b = new Base();
  33.             Child c = new Child(3);
  34.             Console.WriteLine(b.GetM(c));
  35.             Console.WriteLine(c.GetM(c));
  36.             Console.WriteLine(b.GetM((Base)c));
  37.             Console.ReadKey();
  38.         }
  39.     }
复制代码
执行的结果是3,4,3
VTM的知识不太好说,你自己查阅一下,通过我给你的例子是可以发现私有内容也是会被继承的。
但是你只要记住私有的内容在子类中不能被访问就好。
如果理解不了就理解成私有内容不能被继承吧,但这个说法有缺陷的。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
对于这个问题,我个人认为应该从两个方面来说:
一、从内存空间上,子类继承了父类后,那些私有成员是会被分配内存空间的,这个角度来说是算被继承的

二、从多态角度上,对于继承的作用主要是为了实现多态,那么私有成员虽然被继承了,但是却不能访问,这样就不能到达多态的目的,因此,可以说没有被继承。

那么结合我么生活中的实际情况,我们不可能会把要继承的成员设成私有的,这样是无道理的。所以这个问题我们不必过于去深究,明白其原理即可。

以上是我的个人看法,有更好的观点,还望提出,交流。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马