using System; using System.Collections.Generic; using System.Text; using System.Threading;
namespace AppTest { class Demo_virtual { static void Main(string[] args) { 普通,这里的 virtual 作用就跟重写一样了 //Student student = new Student(); //Teacher teacher = new Teacher(); //student.SetHeight(170, 20); //teacher.SetHeight(170, 20);
//Console.WriteLine("Student's height is: {0}, age is {1}", student.Getheight(), student.Getage()); //Console.WriteLine("Teacher's height is: {0}, age is {1}", teacher.Getheight(), teacher.Getage());
//体现 virtual 方法,多态 People people;
//age只是隐藏,所以这里两个输出都是一样 people = new Student(); people.SetHeight(170, 20); Console.WriteLine("people1's height is: {0}, age is {1}", people.Getheight(), people.Getage());
people = new Teacher(); people.SetHeight(170, 20); Console.WriteLine("people2's height is: {0}, age is {1}", people.Getheight(), people.Getage());
Thread.Sleep(3 * 1000);//暂停3秒看结果 } }
class People { public int height; public int age;
public void SetHeight(int h, int a) { height = h; age = a; }
//virtual方法 public virtual int Getheight() { return height; }
//一般方法 public int Getage() { return age; } }
//学生 class Student:People { /*覆盖(override):只能使用"override"关键字来覆盖(override)父类中标记为 * "virtual"、"abstract"或"override"的方法; * 而子类中标记为override的方法, * 也必须是父类中标记为"virtual"、"abstract"或"override"的方法。 */ public override int Getheight() { return height + 5; }
/*隐藏(hide):在子类中创建与父类中的方法具有相同签名 *(相同的方法名,相同的参数列表-参数类型和次序) * 的方法(可以带有"virtual"或"override"关键字)即可实现, * 但建议使用"new"关键字,以明确地隐藏。 */ public new int Getage() { return age + 5; }
/*重载(overload):不需要任何特殊的关键字 * 相同的方法名,返回值可以同可以不同 * 参数类型或次序必须有不完全相同,即至少有一项不同 */ public int Getage(int addAge) { return age + addAge; } }
//老师 class Teacher : People {
} }
/*重载,覆盖,隐藏之间的区别 * 重载(overload)用于同一类中的成员函数,其特征为: * 1)在同一类中 * 2)相同的函数名 * 3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同,注意:和返回值没关系) * 4)和是否虚函数无关 覆盖(override)是指派生类函数覆盖基类函数,其特征为: * 1)不同的范围(分别位于派生类与基类) * 2)相同的函数名称 * 3)参数相同 * 4)基类函数必须是虚函数 隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为: * 1)不同的范围(分别位于派生类与基类) * 2)相同的函数名 (3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载); ()若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖); ()若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。 ()若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。
* 注意: 如果想在派生类中调用基类中的被隐藏的函数,可以在派生类中填写如下代码:using Base::Fun2
转载于:https://www.cnblogs.com/nanshouyong326/archive/2009/02/23/1396663.html
