类的封装,即public, private, protected关键字

来源:互联网 发布:攀枝花 枪击 知乎 编辑:程序博客网 时间:2024/05/16 05:16

类class的使用可以更好的实现对数据结构的封装。在c++中,使用了public, private, protected来实现封装。

 

下面是个简单的例子,class A定义了三个变量分别标识了三种不同的属性。

 

1.当直接访问A的成员时,只有public成员是可以访问的,另外两个是不能被访问的。

2.但是对于子类来说,protected是可以访问的,但是 private是不能访问的。

3. 不论是public继承还是private继承,子类成员函数对父类成员的访问不因继承类型而改变。

    public和protected类型都是可以访问的,而private是不能访问的。

4. public继承和private继承将影响到,通过子类访问父类成员的情况。

    public继承时,父类的成员仍然保持了在父类时的属性。

    private继承时,父类的成员将不能被访问,即使其在父类中是public的。

5. 第四点同样影响到了子类继承时的表现。

    下面例子中,class E的成员函数能像对象b一样访问父类的成员。

    而class F的成员也是像对象c一样,不能访问父类的成员。

 

// =====================================================================================
//
//       Filename:  class.cpp
//
//    Description:  investigate the public,private,protected usage
//
//        Version:  1.0
//        Created:  07/17/2010 01:32:49 AM
//       Revision:  none
//       Compiler:  g++
//
//         Author:  Wizard (), wizarddewhite@gmail.com
//        Company: 
//
// =====================================================================================

#include    <iostream>
using namespace std;

class A
{
public:
    int pub_mem;
protected:
    int pro_mem;
private:
    int pri_mem;
};

class B: public A
{
public:
    B()
    {
        pub_mem = 9;
        pro_mem = 9; // allowed! protected
//        pri_mem = 9; // not allowed, private
    }
};

class C: private A
{
public:
    C()
    {
        pub_mem = 9;
        pro_mem = 9; // allowed! protected
//        pri_mem = 9; // not allowed, private
    }
};

class D: protected A
{
public:
    D()
    {
        pub_mem = 9;
        pro_mem = 9;
//        pri_mem = 9; // not allowed, private
    }
};

class E: public B
{
public:
    E()
    {
        pub_mem = 9;
        pro_mem = 9; // allowed! protected
//        pri_mem = 9; // not allowed, private
    }
};

class F: public C
{
public:
    F()
    {
//        pub_mem = 9; // not allowed,
//        pro_mem = 9; // not allowed, 
//        pri_mem = 9; // not allowed, private
    }
};

class G: public D
{
public:
    G()
    {
        pub_mem = 9;
        pro_mem = 9;
//        pri_mem = 9; // not allowed, private
    }
};

int main ( int argc, char *argv[] )
{
    A a;
    B b;
    C c;
    D d;

    /* A is the base class */
    a.pub_mem = 9;
//    a.pro_mem = 9;// not allowed, protected
//    a.pri_mem = 9;// not allowed, private
   
    /* B is inherited from A, publicly */
    b.pub_mem = 9;
//    b.pro_mem = 9;// not allowed, protected
//    b.pri_mem = 9;// not allowed, private

    /* D is inherited from A, protected */
//    d.pub_mem = 9; // not allowed,
//    d.pro_mem = 9;
//    d.pri_mem = 9;

    /* C is inherited from A, private */
//    c.pub_mem = 9;// not allowed, even this is public, it is iherited with private
//    c.pro_mem = 9;// not allowed, protected
//    c.pri_mem = 9;// not allowed, private
    return 1;
}                // ----------  end of function main  ----------