第10章多态 ■10.1多态的基础 1011虚成员 类中用关键字 virtual修饰的成员称为虚成员,虚成员有虚方法 虚属性和虚索引器。 在类的继承中,派生类获得了基类中的除了构造函数和析构函数 以外的所有成员,派生类不能删除这些成员。对于数据成员,派 生类可以隐藏基类的同名成员或者直接访问非 private成员;对 于行为成员,例如方法、属性、索引器等,也一样可以隐藏基类 的同名成员或者直接调用非 private成员 虚成员和抽象成员是完全不一样的,抽象成员,例如抽象方法, 是不完整的,不能执行的;而虚成员,例如虚方法,是完整的方 法,是可以执行的。仅仅就虚成员所在的类而言,有没有 virtual 修饰词不影响其功能
第10章 多态 10.1.1 虚成员 类中用关键字virtual修饰的成员称为虚成员,虚成员有虚方法、 虚属性和虚索引器。 在类的继承中,派生类获得了基类中的除了构造函数和析构函数 以外的所有成员,派生类不能删除这些成员。对于数据成员,派 生类可以隐藏基类的同名成员或者直接访问非private成员;对 于行为成员,例如方法、属性、索引器等,也一样可以隐藏基类 的同名成员或者直接调用非private成员。 虚成员和抽象成员是完全不一样的,抽象成员,例如抽象方法, 是不完整的,不能执行的;而虚成员,例如虚方法,是完整的方 法,是可以执行的。仅仅就虚成员所在的类而言,有没有virtual 修饰词不影响其功能。 ◼ 10.1 多态的基础
10.1多态的基础 ■10.12重写(覆盖) 重写又称为覆盖。对于基类的 virtua成员,在派生类中 重新加以定义称为重写或者覆盖。虚成员和虚成员的重写提供了 个能产生多态的功能。重写需要使用关键字 override,重写 和隐藏有相似的方面,但有有实质的区别。 如果重写基类的 virtua1成员,派生类的同名成员没有用 override,就等价于使用了缺省的new关键字,这样就产生了 个新的成员,并且隐藏了而不是重写了基类的同名的虚成员,这 样的程序仍然能够编译和运行,但编译时系统会提出警告
10.1 多态的基础 重写又称为覆盖。对于基类的virtual成员,在派生类中 重新加以定义称为重写或者覆盖。虚成员和虚成员的重写提供了 一个能产生多态的功能。重写需要使用关键字override,重写 和隐藏有相似的方面,但有有实质的区别。 如 果重 写基 类的 virtual成 员, 派生 类的 同名 成员 没有 用 override,就等价于使用了缺省的new关键字,这样就产生了一 个新的成员,并且隐藏了而不是重写了基类的同名的虚成员,这 样的程序仍然能够编译和运行,但编译时系统会提出警告。 ◼ 10.1.2 重写(覆盖)
101.3多态对象 用基类类名声明但是用派生类构造函数创建,这类对象的主要 用途是引发多态,为了将它们和一般的对象(声明和创建都使 用同一个类型名的对象)加以区别、揭示它们的特点和用途, 本书将这种形态的对象称为多态对象
10.1.3 多态对象 用基类类名声明但是用派生类构造函数创建,这类对象的主要 用途是引发多态,为了将它们和一般的对象(声明和创建都使 用同一个类型名的对象)加以区别、揭示它们的特点和用途, 本书将这种形态的对象称为多态对象
10.14隐藏和重写的比较 隐藏和重写是基类和派生类的同名成员的两种不同关系,隐 藏可以发生在数据成员和行为成员上,而重写只是对行为成 员而言的;一组同名成员只能体现出一种关系,所以在一般 情况下是不会产生混淆的。但是,在存在虚成员、重写和多 态对象的情况下,分清隐藏和重写两种调用同名方法时机制 的差别是有必要的 10.1.5上溯 把派生类的对象当作基类的对象来处理,称为上溯。检 查上溯是否成立的过程是从基类出发检查派生类中是否重写 了基类的同名虚方法,一直到创建多态对象的派生类类型
10.1.4 隐藏和重写的比较 隐藏和重写是基类和派生类的同名成员的两种不同关系,隐 藏可以发生在数据成员和行为成员上,而重写只是对行为成 员而言的;一组同名成员只能体现出一种关系,所以在一般 情况下是不会产生混淆的。但是,在存在虚成员、重写和多 态对象的情况下,分清隐藏和重写两种调用同名方法时机制 的差别是有必要的。 10.1.5 上溯 把派生类的对象当作基类的对象来处理,称为上溯。检 查上溯是否成立的过程是从基类出发检查派生类中是否重写 了基类的同名虚方法,一直到创建多态对象的派生类类型
10.16编译时的多态和运行时的 多态 如果在编译时就能确定调用什么对象中的成员,称为编译时的 多态,也称为早期绑定,只有当运行时才能确定调用哪个对象 中的成员的情形,称为运行时多态,又称为晚期绑定。 隐藏、重载都属于早期绑定,即编译时的多态;虚方法、重写 和多态对象能引发的是晚期绑定,即运行时的多态
10.1.6 编译时的多态和运行时的 多态 如果在编译时就能确定调用什么对象中的成员,称为编译时的 多态,也称为早期绑定,只有当运行时才能确定调用哪个对象 中的成员的情形,称为运行时多态,又称为晚期绑定。 隐藏、重载都属于早期绑定,即编译时的多态;虚方法、重写 和多态对象能引发的是晚期绑定,即运行时的多态