学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第六节 类(Classes)(9)

设置字体:
----------------------------------

    // derived classes
    #include <iostream.h>
   
    Class CPolygon {
      protected:
        int width, height;
      public:
        void set_values (int a, int b) { width=a; height=b;}
    };
   
    class CRectangle: public CPolygon {
      public:
        int area (void){ return (width * height); }
    };
   
    class CTriangle: public CPolygon {
      public:
        int area (void){ return (width * height / 2); }
    };
   
    int main () {
        CRectangle rect;
        CTriangle trgl;
        rect.set_values (4,5);
        trgl.set_values (4,5);
        cout << rect.area() << endl;
        cout << trgl.area() << endl;
        return 0;
    }
                      
20
10
如上所示,类 CRectangle 和 CTriangle 的每一个对象都包含CPolygon的成员,即: width, height 和 set_values()。
标识符protected 与 private类似,它们的唯一区别在继承时才表现出来。当定义一个子类的时候,基类的protected 成员可以被子类的其它成员所使用,然而private 成员就不可以。因为我们希望CPolygon的成员width 和 height能够被子类CRectangle 和 CTriangle 的成员所访问,而不只是被CPolygon自身的成员操作,我们使用了protected 访问权限,而不是 private。
下表按照谁能访问总结了不同访问权限类型:
可以访问 public protected private
本class的成员 yes yes yes
子类的成员 yes yes no
非成员 yes no no
这里"非成员"指从class以外的任何地方引用,例如从main()中,从其它的class中或从全域(global)或本地(local)的任何函数中。
在我们的例子中,CRectangle 和CTriangle 继承的成员与基类CPolygon拥有同样的访问限制:
   CPolygon::width           // protected access
   CRectangle::width         // protected access
   CPolygon::set_values()    // public access
   CRectangle::set_values()  // public access
  
这是因为我们在继承的时候使用的是public,记得我们用的是:
class CRectangle: public CPolygon;
这里关键字 public 表示新的类(CRectangle)从基类(CPolygon)所继承的成员必须获得最低程度保护。这种被继承成员的访问限制的最低程度可以通过使用 protected 或 private而不是public来改变。例如,daughter 是mother 的一个子类,我们可以这样定义:
class daughter: protected mother;
这将使得protected 成为daughter 从mother处继承的成员的最低访问限制。也就是说,原来mother 中的所有public 成员到daughter 中将会成为protected 成员,这是它们能够被继承的最低访问限制。当然这并不是限制daughter 不能有它自己的public 成员。最低访问权限限制只是建立在从mother中 继承的成员上的。
最常用的继承限制除了public 外就是private ,它被用来将基类完全封装起来,因为在这种情况下,除了子类自身外,其它任何程序都不能访问那些从基类继承而来的成员。不过大多数情况下继承都是使用public的。
----------------------------------
课程列表
重点难点
赞助链接