第8讲 继承

  • 格式:pdf
  • 大小:1.28 MB
  • 文档页数:76

4. 私有继承与保护继承
• 私有继承 派生类对基类的私有继承使用关键字 private 描述(可缺省) 基类的所有公有段和保护段成员都成为派生类的私有成员 • 保护继承 派生类对基类的公有继承使用关键字 protected 描述 基类的所有公有段和保护段成员都成为派生类的保护成员 保护继承在程序中很少应用
2. 派生类不能访问基类私有成员
例: class X { public : void get_ij ( ) ; private : int i , j ; }; class Y : public X { public : int get_k ( ) ; private : int k ; }; void Y :: make_k ( ) ; {k=i*j; }; // 非法 void make_k ( ) ; void put_ij ( ) ;
// ex8_2
class X { protected : int i , j ; public : void get_ij ( ) { cout << “Enter two numbers:” ; cin >> i >> j ; } ; void put_ij ( ) {cout << i << “ ” << j << ‘\n’ ; } ; }; class Y : private X main ( ) { int k ; { Y var1; Z var2 ; public : var1 . get_ij ( ) ; int get_k ( ) { return k ; }; var1 . put_ij ( ) ; void make_k ( ) { k = i * j ; } ; var1 . make_k ( ) ; }; class Z : public Y cout << var1 . get_k ( ) << ‘\n’ ; { public : var2 . put_ij ( ) ; void f( ) } // error {i=2;j=3; }; };
Y 是类 X 的私有派生类 i , j 是类 Y 的私有成员 在 Y 的派生类 Z 中不可见
// ex8_2
class X { protected : int i , j ; public : void get_ij ( ) { cout << “Enter two numbers:” ; cin >> i >> j ; } ; void put_ij ( ) {cout << i << “ ” << j << ‘\n’ ; } ; }; class Y : private X main ( ) { int k ; { Y var1; Z var2 ; public : var1 . get_ij ( ) ; // error int get_k ( ) { return k ; }; var1 . put_ij ( ) ; // error void make_k ( ) { k = i * j ; } ; var1 . make_k ( ) ; }; ห้องสมุดไป่ตู้lass Z : public Y cout << var1 . get_k ( ) << ‘\n’ ; { public : var2 . put_ij ( ) ; // error void f( ) } {i=2;j=3; // error }; };
把基类指针强制转换为派生类指针
public派生类的对象可作为其相应基类的对象处理 从某个特定基类派生出来的各种类,尽管这些类的对象彼此之间互 不相同,但都可以将这些对象视为基类对象处理 反之则不可,基类的对象不能自动成为派生类的对象 将基类对象作为派生类对象处理是错误的 可用显式类型转换把基类指针强制转换为派生类指针,若要复引用该 指针,那么在转换前首先应该把它指向某个派生类的对象
类名 :: 成员
1. 定义与派生类同名的成员
例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; } ; void f ( ) { derived d ; d.a=1; d . base :: b = 2 ; d.b=3; d.c=4; }; // base :: b 使用的是 base 类的数据成员 b // 这里使用的是 derived 类的数据成员 b
8.1
继承概述
class 派生类名 :访问控制 基类名 { 数据成员和成员函数声明 };
2. 派生类的声明语法
其中,访问控制 表示派生类对某个基类的继承方式,使用关键字: public private protected 公有继承 私有继承 保护继承 可缺省声明
8.1
继承概述
例如,汽车类 vehicle 和其派生类小车类 car 的定义: class vehicle { int wheels ; // 车轮数 float weight ; // 汽车重量 public : void initialize (int in_wheels , float in_weight ) ; // 初始化数据成员 int get_wheels ( ) ; // 获取车轮数 float get_weight ( ) ; // 获取车重 float get_loading ( ) ; // 车轮承重 }; class car : vehicle // 缺省声明,私有继承 { int passenger_load : // 载客量 public : void initialize ( int in_wheels , float in_weight , int people = 4 ) ; int passengers ( ) ; // 返回载客数 };
2. 派生类不能访问基类私有成员
重定义的例: class X { public : void get_ij ( ) ; protected : int i , j ; }; class Y : public X { public : int get_k ( ) ; private : int k ; }; void Y :: make_k ( ) ; { k=i*j; }; // 合法 在类 X 和类 Y 外部,仍然 void put_ij ( ) ; 不能访问 i 和 j。除了基类和它 的派生类外,保护段和私有段 成员一样被隐藏。 如: ( ) ; void make_k main ( ) { X obj ; …… int t = obj . i + obj . j ; // error };
8.2
访问控制
派生类对基类成员可以有不同的访问方式: • 派生类可以覆盖基类成员 • 派生类不能访问基类私有成员 • 公有继承 基类的公有段和保护段成员访问权对派生类保持不变 • 私有继承 基类的公有段和保护段成员成为派生类的私有成员
1. 定义与派生类同名的成员
• 如果派生类定义了与基类同名的成员,称派生类的成员覆盖了基 类 的同名成员 • 若要在派生类中使用基类同名成员,可以显式地使用类名限定符:
继承关系中的对象
基类对象和派生类对象 基类的属性和行为表述了基类对象及派生类对象的共性 从基类公有(pubilc)派生出来的所有对象都可以作为基类对象 处理 基类的public成员能够被程序中所有函数访问,private成员只能 被基类的成员函数和友元访问 protected访问是public访问和private访问之间的中间层次 基类的protected成员只能被基类的成员和友元以及派生类的成 员和友元访问 派生类成员简单地使用成员名就可以引用基类的public成员和 protected成员
Y 的私有成员 (从X 私有继承) 在类 Y 之外不可见
// ex8_2 class X 间接派生类不能使用该成员 { protected : int i , j ; 在类外也不可见 public : void get_ij ( ) { cout << “Enter two numbers:” ; cin >> i >> j ; } ; void put_ij ( ) {cout << i << “ ” << j << ‘\n’ ; } ; }; class Y : private X main ( ) { int k ; { Y var1; Z var2 ; public : var1 . get_ij ( ) ; // error int get_k ( ) { return k ; }; var1 . put_ij ( ) ; // error void make_k ( ) { k = i * j ; } ; var1 . make_k ( ) ; }; class Z : public Y cout << var1 . get_k ( ) << ‘\n’ ; { public : var2 . put_ij ( ) ); // error void f( ) } {i=2;j=3; // error }; };
第8讲 派生类与继承
8.1 8.2 8.3 8.4 8.5 继承概述 访问控制 基类的初始化 多重继承 赋值兼容原则
8.1
1. 继承
继承概述
• 继承 是类之间定义的一种重要关系 • 一个 B 类继承A类,或称从类 A 派生类 B 类 A 称为基类(父类),类 B 称为派生类(子类) B1,B2 的基类 A 的派生类 C1,C2,C3 的基类 A A 的派生类(单继承) B2 C3的基类
B1
B1 的派生类