C++学习笔记(2)——派生类的继承权与访问域

晨曦之光 发布于 2012/03/09 14:14
阅读 91
收藏 0

对于基类的私有成员,不论派生类型如何,派生类及派生类的使用者都无权访问;

对于基类的保护成员,不论派生类型如何,派生类可以访问,但派生类的使用者无权访问;

对于基类的公有成员,按派生类型,分三类情况:

私有派生:继承后变成派生类的私有成员,派生类可以访问,但派生类的使用者不能访问;

保护派生:继承后变成派生类的保护成员,派生类可以访问,但派生类的使用者不能访问;

公有派生:继承后变成派生类的公有成员,派生类和派生类的使用者都能访问;

 

派生类可以访问:在派生类的成员函数中可以访问,即在派生类的成员函数中可以被使用;

派生类的使用者:即定义的派生类的对象,或者使用该派生类的函数;

派生类的使用者不能访问:即使用对象访问符号“.”不能访问其成员;也即在(派生)类外不能访问;

 

派生类的继承权与访问权,总结如下两个表:

基类成员性质

派生类型

在派生类中的性质

在派生类中能否访问

派生类对象能否访问

Private

Private

私有派生

不可访问

不能访问

不能访问

Protected

Private

可以访问

不能访问

Public

Private

可以访问

不能访问

Private

Protected

保护派生

不可访问

不能访问

不能访问

Protected

Protected

可以访问

不能访问

Public

Protected

可以访问

不能访问

Private

Public

公有派生

不可访问

不能访问

不能访问

Protected

Protected

可以访问

不能访问

Public

Public

可以访问

可以访问

 

基类成员性质

派生类型

在派生类中的性质

在派生类中能否访问

派生类对象能否访问

 

Private

Private

不可访问

不能访问

不能访问

Protected

不可访问

不能访问

不能访问

Public

不可访问

不能访问

不能访问

 

Protected

Private

Private

可以访问

不能访问

Protected

Protected

可以访问

不能访问

Public

Protected

可以访问

不能访问

 

Public

Private

Private

可以访问

不能访问

Protected

Protected

可以访问

不能访问

Public

Public

可以访问

可以访问

 

派生类不能访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数。

若要直接访问,有两种方法:

在类定义体中增加保护段(protected),将基类私有成员提供派生类访问的部分放置在保护段;派生类对基类的保护成员的继承与公有成员类似,若为公有派生,则在派生类中也处于保护段;若为私有派生,则在派生类中变为私有成员。

将需要访问基类私有成员的派生类成员函数声明为基类的友元。   

===================================================================

例1:公有继承

/************************************************************************
* 派生类的继承权与访问域——公有继承
***********************************************************************
*/

//////////////////////////////////////////////////////////////////////////
// 基类
class  CBase
{
private:
    
int x;
    
void func1(){x=100;}
protected:
    
int y;
    
void func2(){y=200;}
public:
    
int z;
public:
    
void func3();
    CBase();
}
;

CBase::CBase()
{
    x
=10;
    y
=20;
    z
=30;
}


void  CBase::func3()
{
    z
=300;
}

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

// 派生类(公有继承——public)
class  CDerive :  public  CBase
{
private:
    
int a;
protected:
    
int b;
public:
    
int c;
public:
    CDerive();
    
void func();
}
;

CDerive::CDerive()
{
    a
=40;
    b
=50;
    c
=60;
}


void  CDerive::func()
{    
    
//x=1000;    //cannot access private member declared in class 'CBase'
    y=2000;
    z
=3000;
    
    CBase();    
//此处调用没有错误,但是不会对派生类的对象的数据成员进行修改
    
//func1();    //cannot access private member declared in class 'CBase'
    func2();
    func3();
}


//////////////////////////////////////////////////////////////////////////
// 主函数
void  main()
{
    CBase obj1;
    CDerive obj2;    

    
//obj2.x=10000;    //cannot access private member declared in class 'CBase'
    
//obj2.y=20000;    //cannot access protected member declared in class 'CBase'
    obj2.z=30000;

    
//obj2.a=40000;    //cannot access private member declared in class 'CDerive'
    
//obj2.b=50000;    //cannot access protected member declared in class 'CDerive'
    obj2.c=60000;

    
//obj2.func1();        //cannot access private member declared in class 'CBase'
    
//obj2.func2();        //cannot access private member declared in class 'CBase'
    obj2.func3();
    obj2.func();
}

 

 

例2:保护继承

/************************************************************************
* 派生类的继承权与访问域——保护继承
***********************************************************************
*/

//////////////////////////////////////////////////////////////////////////
// 基类
class  CBase
{
private:
    
int x;
    
void func1(){x=100;}
protected:
    
int y;
    
void func2(){y=200;}
public:
    
int z;
public:
    
void func3();
    CBase();
}
;

CBase::CBase()
{
    x
=10;
    y
=20;
    z
=30;
}


void  CBase::func3()
{
    z
=300;
}

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

// 派生类(保护继承——protected)
class  CDerive :  protected  CBase
{
private:
    
int a;
protected:
    
int b;
public:
    
int c;
public:
    CDerive();
    
void func();
}
;

CDerive::CDerive()
{
    
//CBase();            //正确条用,但在此不必条用
    
//CDerive::CBase();    //错误调用,'CBase' is not a member of 'CDerive'
    a=40;
    b
=50;
    c
=60;
}


void  CDerive::func()
{    
    
//x=1000;    ////cannot access private member declared in class 'CBase'
    y=2000;
    z
=3000;

    
//CBase();    //此处调用没有错误,但是不会对派生类的对象的数据成员进行修改
    
//func1();    //cannot access private member declared in class 'CBase'
    func2();
    func3();
}


//////////////////////////////////////////////////////////////////////////
// 主函数
void  main()
{
    CBase obj1;
    CDerive obj2;    

    
//obj2.x=10000;    //cannot access private member declared in class 'CBase'
    
//obj2.y=20000;    //cannot access protected member declared in class 'CBase'
    
//obj2.z=30000;    //cannot access public member declared in class 'CBase'

    
//obj2.a=40000;    //cannot access private member declared in class 'CDerive'
    
//obj2.b=50000;    //cannot access protected member declared in class 'CDerive'
    obj2.c=60000;
    
    
//obj2.func1();    //cannot access private member declared in class 'CBase'
    
//obj2.func2();    //cannot access private member declared in class 'CBase'
    
//obj2.func3();    //cannot access private member declared in class 'CBase'
    obj2.func();
}

 

例3:私有继承

/************************************************************************
* 派生类的继承权与访问域——私有继承
***********************************************************************
*/

//////////////////////////////////////////////////////////////////////////
// 基类
class  CBase
{
private:
    
int x;
    
void func1(){x=100;}
protected:
    
int y;
    
void func2(){y=200;}
public:
    
int z;
public:
    
void func3();
    CBase();
}
;

CBase::CBase()
{
    x
=10;
    y
=20;
    z
=30;
}


void  CBase::func3()
{
    z
=300;
}

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

// 派生类(私有继承——private)
class  CDerive : CBase
{
private:
    
int a;
protected:
    
int b;
public:
    
int c;
public:
    CDerive();
    
void func();
}
;

CDerive::CDerive()
{
    
//CBase();            //正确条用,但在此不必条用
    
//CDerive::CBase();    //错误调用,'CBase' is not a member of 'CDerive'
    a=40;
    b
=50;
    c
=60;
}


void  CDerive::func()
{    
    
//x=1000;    //cannot access private member declared in class 'CBase'
    y=2000;
    z
=3000;

    
//CBase();    //此处调用没有错误,但是不会对派生类的对象的数据成员进行修改
    
//func1();    //cannot access private member declared in class 'CBase'
    func2();
    func3();
}


//////////////////////////////////////////////////////////////////////////
// 主函数
void  main()
{
    CBase obj1;
    CDerive obj2;    

    
//obj2.x=10000;    //cannot access private member declared in class 'CBase'
    
//obj2.y=20000;    //cannot access protected member declared in class 'CBase'
    
//obj2.z=30000;    //cannot access public member declared in class 'CBase'
    
    
//obj2.a=40000;    //cannot access private member declared in class 'CDerive'
    
//obj2.b=50000;    //cannot access protected member declared in class 'CDerive'
    obj2.c=60000;
    
    
//obj2.func1();    //cannot access private member declared in class 'CBase'
    
//obj2.func2();    //cannot access private member declared in class 'CBase'
    
//obj2.func3();    //cannot access private member declared in class 'CBase'
    obj2.func();
}

原文链接:http://blog.csdn.net/livelylittlefish/article/details/270248
加载中
返回顶部
顶部