昨天我做窗口程序的时候,发现了一个迷惑不解的问题。
我创建主窗口Form1, 另又创建一继承于Form1的窗口Form2的对像实例form.
接着显示form.ShowDialog();于是form窗口上就显示出了所有Form1的控件。
但我看了一下Form1上控件的声明,全是private的。
form怎么能继承基类的private控件呢?
于是我就无语了,这难道是微软VS2005的重大Bug?
我创建主窗口Form1, 另又创建一继承于Form1的窗口Form2的对像实例form.
接着显示form.ShowDialog();于是form窗口上就显示出了所有Form1的控件。
但我看了一下Form1上控件的声明,全是private的。
form怎么能继承基类的private控件呢?
于是我就无语了,这难道是微软VS2005的重大Bug?
如3楼所述,private只是访问限定,你在派生类中无法去操作它,但它还是存在的
form2实现了form1的全部功能和属性。那么它显示出form1的样子是理所当然的。
假如form1实现了一个窗口的A部分,form2在A的基础上实现了一部分代码B,结合起来形成了代码C,也就是fomr2。private只是控制在form2中的那一部分代码B不能访问form1中的代码A。但不能访问,并不表示形成实例以后的form2中的A那部分代码不工作啊?
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();
}
}
}
而且上面的东西你一定说是父类的么?
10、15一定就是子类的么?我说是父类的不可以呀,它仅仅是调用了父类的接口来访问而已。这正是我没有弄明白的。
我要的就是子类的方法,子类肯定有paint方法,它调用了父类的么?如果没有调用父类的方法肯定是覆盖的。10、15一定就是子类的么?我说是父类的不可以呀,它仅仅是调用了父类的接口来访问而已。这正是我没有弄明白的。
class a:b
那么a就一定是b。在使用b的地方,可以用a代替。
b的一切特性a都具备。
b有一个按钮,那么a肯定有这个按钮。
至于Private修饰,只是说,a可不可以修改b中的这个特性。与显示不显示无关。
三年的c++居然连这都不知道。估计你一直拿c++当c用。
子类是如何构造的我真的不知道,但我知道他一定不会自己调用base.OnPaint。
子类的Paint方法调用了父类的Paint然后才是自己的实现,注意"base.OnPaint"
你的误解正是在此,10的确是父类的,但15却一定是子类的,之所以如此证明,说明在子类里可以访问父类的私有属性,你一定没重写过OnPaint方法吧,敲完override按空格选择OnPaint回车你看看出现的是什么吧。
我晕~~你彻底混淆了private的作用与控件是否显示的关系,private是访问限制,与其修饰的成员是否会被paint出来毫无关系,只要在方法里说了:你给我显示,该成员就会在paint的时候显示。
首先继承是一个名字,Java编程思想解释过,继承可以看作是“is-a”的关系,即子类是父类的一种,子类拥有父类所有的特征,打个比方,假设一个前提:人的所有特征由一条染色体决定,那么儿子继承父亲,则儿子的胡子肯定和父亲一模一样,但这胡子是儿子的。但是在程序中不会这样,我曾和我的朋友们讨论过这个问题,当继承的时候,子类是把父类的所有东西复制过来了还是在使用的时候去调用父类的东西,为了证明,我在编译完父类和子类后将父类删除,结果单独使用子类的时候报错,说明子类在调用父类的东西的时候是直接在内存中加载父类,也就是说在使用的过程中,父类在内存中保存自己的东西,子类在单纯的继承(未有自身的任何特性)时只是在内存中指向父类的这块内存而已。你是学C++的,内存操作肯定比我熟,这些就不用我再多解释了吧。
LZ三年C++绝对白学了.要是在公司,也只能算是骗了公司三年钱.