昨天我做窗口程序的时候,发现了一个迷惑不解的问题。
我创建主窗口Form1, 另又创建一继承于Form1的窗口Form2的对像实例form.
接着显示form.ShowDialog();于是form窗口上就显示出了所有Form1的控件。
但我看了一下Form1上控件的声明,全是private的。
form怎么能继承基类的private控件呢?
于是我就无语了,这难道是微软VS2005的重大Bug?

解决方案 »

  1.   

    父类的paint画自己的控件啊,private只是访问限定而已
      

  2.   

    虽然不支持多看书,但LZ确实需要看下书先.
    如3楼所述,private只是访问限定,你在派生类中无法去操作它,但它还是存在的
      

  3.   

    但是子类也有paint函数,它怎么会用父类的呢?
      

  4.   

    但是子类也有paint画自己的控件,它怎么会用父类的呢?
      

  5.   

    我觉得这个问题简单点理解来说:
    form2实现了form1的全部功能和属性。那么它显示出form1的样子是理所当然的。
    假如form1实现了一个窗口的A部分,form2在A的基础上实现了一部分代码B,结合起来形成了代码C,也就是fomr2。private只是控制在form2中的那一部分代码B不能访问form1中的代码A。但不能访问,并不表示形成实例以后的form2中的A那部分代码不工作啊?
      

  6.   

    你儿子也有小jj,他怎么会长的像你呢?“继承”两个字就算不学OO也该知道是什么意思...没事儿先看看书...
      

  7.   

    private代表什么,代表除了自己,不管谁都不能访问和操作。你要是想访问必须通过我的接口来访问.在子类中也一样,你要是想显示我的控件,必须通过接口来访问。问题是其中的原理是怎么样的,这才是我想要弄明白的。而且这些控件有没有被子类继承我还不知道,既然不能访问,又何需要继承下来。要是想要访问,只要通过子类接口去访问而已。又何必继承下来。
      

  8.   

    首先你要弄明白控件是怎么绘出来,在你继承之后的OnPaint方法中可以看到的第一行就是base.OnPaint,也就是调用父类的OnPaint方法。既然编了三年的C++,就应该清楚父类的私有属性被子类继承时依然存在,只是无法直接访问,但通过父类的方法还是可以访问的!以下是证明示例:
    namespace ConsoleApplication1
    {
        class A
        {
            private int i = 10;
            public virtual void GetI()
            {
                Console.WriteLine(i);
            }
        }
        class B : A
        {
            private int i = 15;
            public override void GetI()
            {
                base.GetI();
                Console.WriteLine(i);
            }
        }
        class Class1
        {
            static void Main(string[] args)
            {
                B b = new B();
                b.GetI();//结果输出10、15
                Console.ReadLine();
            }
        }
    }
      

  9.   

    我要的就是子类的方法,子类肯定有paint方法,它调用了父类的么?如果没有调用父类的方法肯定是覆盖的。
    而且上面的东西你一定说是父类的么?
    10、15一定就是子类的么?我说是父类的不可以呀,它仅仅是调用了父类的接口来访问而已。这正是我没有弄明白的。
      

  10.   

    这里有句话错了:
    我要的就是子类的方法,子类肯定有paint方法,它调用了父类的么?如果没有调用父类的方法肯定是覆盖的。10、15一定就是子类的么?我说是父类的不可以呀,它仅仅是调用了父类的接口来访问而已。这正是我没有弄明白的。
      

  11.   

    什么叫继承。
    class a:b
    那么a就一定是b。在使用b的地方,可以用a代替。
    b的一切特性a都具备。
    b有一个按钮,那么a肯定有这个按钮。
    至于Private修饰,只是说,a可不可以修改b中的这个特性。与显示不显示无关。
    三年的c++居然连这都不知道。估计你一直拿c++当c用。
      

  12.   

    如果说private属性非要是子类也继承到了,又何必这样呢?父类有的,子类又何必拥有,它仅仅是通过接口来访问父类的而已。
      

  13.   

    要虚心,13楼说的很明白,子类的Paint方法调用了父类的Paint然后才是自己的实现,注意"base.OnPaint"
      

  14.   

    你强,private仅仅是不可以修改吗?他不能限制显示么?
      

  15.   

    说实在的我我今天真的明白了我三年c++真的是当c用了,跟你也说不清楚。
    子类是如何构造的我真的不知道,但我知道他一定不会自己调用base.OnPaint。
    子类的Paint方法调用了父类的Paint然后才是自己的实现,注意"base.OnPaint"
      

  16.   


    你的误解正是在此,10的确是父类的,但15却一定是子类的,之所以如此证明,说明在子类里可以访问父类的私有属性,你一定没重写过OnPaint方法吧,敲完override按空格选择OnPaint回车你看看出现的是什么吧。
      

  17.   

    看看两个类的构造函数吧,子类构造的时候会不会调用父类的构造函数呢?会,而构造函数里面是什么呢?"InitializeComponent()",这个方法里面去加控件的,当然父类有的子类也有呀
      

  18.   


    我晕~~你彻底混淆了private的作用与控件是否显示的关系,private是访问限制,与其修饰的成员是否会被paint出来毫无关系,只要在方法里说了:你给我显示,该成员就会在paint的时候显示。
      

  19.   


    首先继承是一个名字,Java编程思想解释过,继承可以看作是“is-a”的关系,即子类是父类的一种,子类拥有父类所有的特征,打个比方,假设一个前提:人的所有特征由一条染色体决定,那么儿子继承父亲,则儿子的胡子肯定和父亲一模一样,但这胡子是儿子的。但是在程序中不会这样,我曾和我的朋友们讨论过这个问题,当继承的时候,子类是把父类的所有东西复制过来了还是在使用的时候去调用父类的东西,为了证明,我在编译完父类和子类后将父类删除,结果单独使用子类的时候报错,说明子类在调用父类的东西的时候是直接在内存中加载父类,也就是说在使用的过程中,父类在内存中保存自己的东西,子类在单纯的继承(未有自身的任何特性)时只是在内存中指向父类的这块内存而已。你是学C++的,内存操作肯定比我熟,这些就不用我再多解释了吧。
      

  20.   

    粗略看了下
    LZ三年C++绝对白学了.要是在公司,也只能算是骗了公司三年钱.