1.类继承
通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展。
1.可以使用- 一个已经存在的类作为新类的基础。.已存在的类称为基类(baseclass),新类称为派生类(derivedclass)。派生类成员的组成如下:
(1)自己声明中的成员。
(2)基类的成员.
2.要声明一个派生类,需要在类名后加入基类规格说明。基类规格说明由冒号和后面跟着用作基类的类的名称组成。派生类被描述为直接继承自列出的基类。“
3.派生类被描述为扩展它的基类,因为它包含了基类的成员,加上在它自己的声明中的任何附加功能。
4. 派生类不能删除它所继承的任何成员。
2.所有类都派生自Object类
关于类继承的其他重要内容如下:
1.一个类声明的基类规格说明中只能有- 一个单独的类。这称为单继承。
2.虽然类只能直接继承- 一个基类,但继承的层次没有限制。也就是说,作为基类的类可以派生自另外- 一个类,而它又派生自另外一个类,直下去,直至最终到达object.
3.隐藏基类的成员
虽然派生类不能删除它继承的任何成员,但它可以隐藏它们。
1.要隐藏- 一个继承的数据成员,需要声明- 一个新的相同类型的成员,并使用相同的名称。
2.通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承的函数成员。请记住,签名由名称和参数列表组成,但不包括返回类型。
3.要让编译器知道你在故意隐藏继承的成员,使用new修饰符。没有它,程序可以成功编译,但编译器会警告你隐藏了一个继承的成员。
4.也可以隐藏静态成员。
4.基类访问
5.虚方法和覆盖写法
在上- 一节看到,当使用基类引用访问派生类对象时,得到的是基类的成员。虚方法可以使基类的引用访问“升至”派生类内。
可以使用基类引用调用派生类(derivedclass) 的方法,只需满足下面的条件:
1.派生类的方法和基类的方法有相同的签名和返区类型。
2.基类的方法使用virtua1标注。
3.派生类的方法使用override标注。
其他关于virtual和override修饰符的重要信息如下:
1.覆写和被覆写的方法必须有相同的可访问性。换一种说法,被覆写的方法不能是private等,而覆写方法是public。
2.不能覆写static 方法或非虚方法。口方法、属性和索引(在前-章阐述),以及称为事件(将在后面阐述) 的另一种成员类型,它们都可以被声明为virtua1和override.
6.覆写标记为overridede方法
覆写方法可以在继承的任何层次出现。
1.当使用对象基类部分的引用调用- 一个覆写的方法时,方法的调用被沿派生层次上溯执行,直到标记为override的方法的最派生(most-derived) 版本。
2.如果在更高的派生级别有该访法的其他声明,但没有被标记为override,那么它们不会被调用。
7.构造函数的执行
1.要创建对象的基类部分,基类的- 一个构造函数被作为创建实例过程的- 一部分被调用。
2.继承层次链中的每个类在执行它自己的构造函数体之前执行它的基类的构造函数。
例如,下面的代码展示了类MyDerivedClass和它的构造函数的声明。当该构造丽数被调用时,它在执行自己的方法体之前调用无参数的构造函数MyBaseClass( )。
8.构造函数初始化语句
默认情况下,在对象被构造时,基类的无参数构造函数被调用。但构造函数可以被重载,所以基类可能有- 一个以上的构造函数。如果希望派生类使用- 一个指定的基类构造函数而不是无参数构造函数,必须在构造函数初始化语句中指定它。
有两种形式的构造函数初始化语句:
1.第- 一种形式使用关键字base并指明使用哪- 一个基类构造函数。
2.第二种形式使用关键字this 并指明应该使用当前类的哪- 一个另外的构造函数。
基类构造初始化语句放在冒号后面,冒号紧跟着类的构造函数声明的参数列表。构造函数初始化语句由关键字base和要调用的基类构造函数的参数列表组成。
例如:
下面的代码展示了类MyDerivedClass的构造函数。
1.构造函数初始化语句指明要使用的基类构造函数是有两个参数的那个。第一个参数是一个string,第二个参数是- 一个int。
2.在基类参数列表中的参数必须在类型和顺序方面匹配已定的基类构造函数的参数列表。