私有 公有 保护 不可访问 可访问(公有) 可访问(保护) 不可访问 可访问(私有) 可访问(私有) 不可访问 可访问(保护) 可访问(保护) 从以下的表中可以看出,在直接派生中,可访问情况结果是一样的,但如果再继续派生,它们就会有所不同了。这个问题在下面的多级派生中讲解。
下面再来看一个实例
//思考题:自编,继承父类成员的简单实例 #include class Rectangle:public Point { int W,H; public: void setRectangle(int x,int y,int w,int h){setPoint(x,y);W=w;H=h;} int getW(){return W;} int getH(){return H;} //void displayRectangle(){cout< int main() { Rectangle rect; rect.setRectangle(2,3,10,20); rect.move(2,3); //cout< 从上例我们可以了解到派生类Rectangle从基类Point公有继承,所以继承了基类中的全部公有成员和私有成员(构造函数与析构函数除外),并可以访问基类中的公有成员setPoint、move、getX 、getY和displayPoint,此外,它还有比父类多一些的信息,即它有W、H数据成员以及setRectangle、getW、getH、displayRectangle成员函数。 下面来看一下书中的实例。 //例5.3 在派生类中引用保护成员 #include class Student //声明基类 {public: //基类公用成员 void display( ); void get_value(){cin>>num>>name>>sex;} protected : //基类保护成员 int num; string name; char sex; }; void Student::display( ) {cout<<\ cout<<\ cout<<\ } class Student1: protected Student //用protected继承方式声明一个派生类 {public: void display1( ); void get_value1(){cin>>age>>addr;} private: int age; string addr; }; void Student1::display1( ) {cout<<\ //引用基类的保护成员,合法 cout<<\ //引用基类的保护成员,合法 cout<<\ //引用基类的保护成员,合法 cout<<\ //引用派生类的私有成员,合法 cout<<\ //引用派生类的私有成员,合法 } int main( ) { Student1 stud1; //stud1是派生类student2的对象 stud1.get_value(); stud1.get_value1(); stud1.display1( ); //display是派生类中的公用成员函数 return 0; } 下面再来看一个实例。 //思考题:自编。 #include //------------------------------------- class Base { int a; void f(){cout< void g(){cout< void k(){cout< class Derived:public Base{ //改为private、protected,再看结果 public: void df(){ //cout< void func(){ Base b; //cout< 从上面的实例中可以了解到以下信息: 公有 在基类中对基类成员的访问能力 √ 公有派生类对基类成员的访问能力 √ 在类外对基类成员的访问能力 √ 保护 私有 √ √ √ × × × 那么如果是保护派生呢?情况会怎么样?通过程序的运行,可以知道与上述情况完全一样。如果私有派生呢?情况也一样,那到底有什么区别呢?在多级派生中可以得到答案。 5.4.4 多级派生时的访问属性 下图是一个典型的多级继承结构图,我们用程序来描述。 A B C //例5.4 多级派生的访问属性 class A//基类 {public: int i; protected: void f2( ); int j; private: int k; }; class B: public A //public方式 {public: void f3( ); protected: void f4( ); private: int m; }; class C: protected B //protected方式 {public: void f5( ); private: int n; }; int main() { return 0; } 我们用一个表格形式来看各成员在不同类中的访问情况: 成员 i 类 基类A 公有派生类B 保护派生类C 公有 √ 公有 √ 保护 √ f2 保护 √ 保护 √ 保护 √ f2 保护 √ 保护 √ 保护 √ f2 保护 √ 私有 √ 不可访问× j k f3 × 公有 √ 保护 √ f3 × 公有 √ 保护 √ f3 × 公有 √ 保护 √ f4 × m × f5 × × 公有 √ f5 × × 公有 √ f5 × × 公有 √ n × × 私有 √ n × × 私有 √ n × × 私有 √ 保护 私有 √ √ 保护 不可访√ 问× 保护 不可访√ 问× j k 保护 私有 √ √ 保护 不可访√ 问× f4 × m × 如果是保护派生,访问情况如下表: 成员 i 类 基类A 公有 √ 保护 私有 √ √ 保护 不可访√ 问× 保护 不可访√ 问× j k 保护 保护 派生类B √ 保护派生类C 保护 √ 保护 私有 √ √ 保护 不可访√ 问× f4 × m × 如果是私有派生,访问情况如下表: 成员 i 类 基类A 公有 √ 保护 私有 √ √ 私有 不可访√ 问× 不可访问× 不可访问× 私有 私有 派生类B √ 保护派生类C 不可访问× 保护 私有 √ √ 保护 不可访√ 问× 通过以上分析可知,无论是哪一种继承方式,在派生类中都不能访问基类中的私有成员,如果在多级派生时采用公用继承方式,直到最后一级派生类都能访问基类的公有成员和保护成员。如果采用私有继承方式,经过若干派生后,基类的所有的成员都不可访问了。如果采用保护继承方式,在派生类外是无法访问派生类中的任何成员的。 在经过多次派生后,人们很难记清楚各成员的访问情况,因此在实际应用中多采用公有继承。 //思考题:阅读下列程序,画出访问情况表。 class A{ int i; public: void f1(); protected: void f2(); }; class B:public A{ int m; public: 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章 继承与派生(2)在线全文阅读。
相关推荐: