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