可以将派生类Studentl的声明改为 class Studentl:public Student private: /以public方式声明派生类Studentl int age; public: string addr; void display_1() }; {cout<<" age:”<age<endl; /引用派生类的私有成员,正确 cout<<” address:"<<addr<<endl; //引用派生类的私有成员,正确 然后在main函数中分别调用基类的display函数和派生 类中的display1函数,先后输出5个数据。 可以这样写main函数(假设对象stud中已有数据):
可以将派生类Student1的声明改为 class Student1: public Student //以public方式声明派生类Student1 {public: void display_1( ) {cout<<″ age: ″<<age<<endl; //引用派生类的私有成员,正确 cout<<″ address: ″<<addr<<endl; //引用派生类的私有成员,正确 } private: int age; string addr; }; 然后在main函数中分别调用基类的display函数和派生 类中的display_1函数,先后输出5个数据。 可以这样写main函数(假设对象stud中已有数据):
int main() {Student1 stud; //定义派生类Student1的对象stud stud.get_value() stud.display(); //调用基类的公用成员函数,输出基类中3个数据成员的值 stud.display_1(); //调用派生类的公用成员函数,输出派生类中两个数据成员 的值 return 0; 实际上,程序还可以改进,在派生类的display1函数中调 用基类的display函数,在主函数中只要写一行: stud.display 10); 即可输出5个数据
实际上,程序还可以改进,在派生类的display_1函数中调 用基类的display函数,在主函数中只要写一行: stud.display_1(); 即可输出5个数据。 int main( ) {Student1 stud; //定义派生类Student1的对象stud stud.get_value( ) stud.display( ); //调用基类的公用成员函数,输出基类中3个数据成员的值 stud.display_1(); //调用派生类的公用成员函数,输出派生类中两个数据成员 的值 return 0; }
11.4.2私有继承 定义:将基类的继承方式指定为WNat的,称为私有继承 私有派生类private derivedelass】,用私有继承方式建立的派生类 其基类称为私有基类(private base class)。 公用成员 私有成员 私有基类的 保护成员 私有继承 公用成员和 私有成员 保护成员理 私有继承 派生类中成为不 所当然地成 私有成员 可访问的成员,是 为派生类中 隐蔽的 的私有成员 只有基类的成员函数可以引用它们基类外当然不能访问
11.4.2 私有继承 定义:将基类的继承方式指定为private的,称为私有继承 其基类称为私有基类(private base class)。 公用成员 保护成员 私有成员 私有成员 私有继承 私有派生类(private derivedclass),用私有继承方式建立的派生类 私有成员 派生类中成为不 可访问的成员,是 隐蔽的 私有继承 只有基类的成员函数可以引用它们,基类外当然不能访问 私有基类的 公用成员和 保护成员理 所当然地成 为派生类中 的私有成员
个基类成员在基类中的访问属性和在派生类中的访问 属性可能是不同的。私有基类的成员在私有派生类中的 访问属性见书中表11.7。 基类A 派生类B 派生类B public: public: public: int i,j; 私有继承 int i,j; int m,n; private: private: private: int k; int k; inti,j,P; public: 声明派生类 int m,n; 新增的成员 private: int p; (a (b) (c) 图1.7
图11.7 一个基类成员在基类中的访问属性和在派生类中的访问 属性可能是不同的。私有基类的成员在私有派生类中的 访问属性见书中表11.7
例11.2将例11.1中的公用继承方式改为用私有继承方式 (基类Student不改)。 可以写出私有派生类如下: class Student1:private Student /用私有继承方式声明派生类Stu一个成员在不 同的派生层次 输出两个数据 V心.成员的值 中的访问属性 {cout<<"age:"<<age<<end 可能是不同的。 /引用派生类的私有成员有关。 它与继承方式 cout<<"address:"<<addr<<endi, /引用派生类的私有成员,正确 对于不需要再往下继承的类的功 能可以用私有继承方式把它隐蔽 起来,这样,下一层的派生类无 法访问它的任何成员
例11.2 将例11.1中的公用继承方式改为用私有继承方式 (基类Student不改)。 可以写出私有派生类如下: class Student1: private Student //用私有继承方式声明派生类Student1 {public: void display_1( ) {cout<<″age: ″<<age<<endl; //引用派生类的私有成员,正确 cout<<″address: ″<<addr<<endl;} //引用派生类的私有成员,正确 private: int age; string addr; }; 对于不需要再往下继承的类的功 能可以用私有继承方式把它隐蔽 起来,这样,下一层的派生类无 法访问它的任何成员 一个成员在不 同的派生层次 中的访问属性 可能是不同的。 它与继承方式 有关。 输出两个数据 成员的值