全部博文(237)
分类: C/C++
2011-02-21 15:13:47
下面是override的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test(); //调用A中Test();
b.Test(); //调用B中Test();
a1.Test(); //调用B中Test();系统会自动识别a1是B的实例
((A)b).Test(); //与上面相同
note:C#中override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚
属性或虚函数,使基类的虚函数和虚属性在整个继承链中都不可见
(在子类中用base关键字调用除外,使用base关键字可访问基类的属性或者函数)。
子类调用override是重写基类的virtual修饰的函数,与c++的多态机制是一样的
下面是new的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test();//调用A中Test();
b.Test();//调用B中Test();
a1.Test();//调用A中Test();
((A)b).Test();//与上面相同
note:c# new关键字表示隐藏,是指加上new关键字的属性或者函数将对本类和继承类隐藏基类的同名属性或函数。
a1.Test()会调用A.test()是因为:class B继承于class A,现在B中的Test函数隐藏A中的Test函数,所以从B(包括继承于B的子类)
的角度来看类中的Test就是B.Test,A的Test不可见,但是如果从A的角度来看B,A只认识类B中继承于类A的Test函数,对于B类中的Test,它
不可见。所以a1.Test调用了继承于A的Test函数
chinaunix网友2011-03-05 18:50:15
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com
chinaunix网友2011-03-05 18:49:48
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com