HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

三种继承

Posted on 2011-09-19 14:33  光铭  阅读(146)  评论(0编辑  收藏  举报

1. 私有成员在派生类中是无权直接访问的,只能通过调用基类中的公有成员函数的方式实现。

2. 一定要直接访问基类中的私有成员,可以把这些成员说明为保护成员protected。一般格式:

Class 类名
{
[private:]
  私有成员
protected:
  保护成员
public:
  公有成员
};

1、不涉及派生时,保护成员与私有成员的地位完全一致。



#include <iostream.h>
//***************************************************
class samp
{
  int a;
protected:
  int b;
public:
  int c;
  samp(int n,int m){a=n;b=m;}
  int geta(){return a;}
  int getb(){return b;}
};

//***************************************************

void main()

{

  samp obj(10,20);

  // obj.a=11; //Error,私有成员

  // obj.b=22; //Error,保护成员

  obj.c=33; //Ok
  cout<<obj.geta()<<' '<<obj.getb()<<' '<<obj.c<<endl; //Ok
}

输出结果:10 20 33



2、以公有派生时:基类中的保护成员->在派生类中仍是保护的



//基类中的保护成员在公有派生的派生类中仍是保护的

#include <iostream.h>
//**********************************************************
class base{
 protected:
  int a,b;
 public:
  void setab(int n,int m){a=n;b=m;}
};



class derive:public base{
  int c;
 public:
  void setc(int n){c=n;}
  void showabc(){ cout<<a<<' '<<b<<' '<<c<<endl; }
};

//**********************************************************

void main()
{
  derive obj;
  obj.setab(2,4); //setab在派生类里仍是公有的,可以访问
  obj.setc(3);
  obj.showabc();
}

输出结果:2 4 3

3、以私有派生时:基类中的保护成员à在派生类中是私有的。



// 保护性成员在私有派生时,为私有的

#include <iostream.h>

//******************************************************

class base //基类
{
protected:
  int a;
public:
  void seta(int sa){a=sa;}
};

//drive1中,a、seta都变成私有的成员

class derive1:private base //私有派生类
{
 protected:
  int b;
public:
  void setb(int sb){b=sb;}  
};

//derive2中a和seta均为私有的成员,setb仍为公有的,b还是保护的

class derive2:public derive1 //公有派生类
{
  int c;
public:
  void setc(int sc){c=sc;}
  void show()
  {
    //cout<<a<<endl; //Error(因为a是基类的私有成员,只能通过基类的公有成员来访问)
    cout<<"b="<<b<<endl;
    cout<<"c="<<c<<endl;
  }
};

//******************************************************

void main()

{
  base op1;op1.seta(1);

  derive1 op2; op2.setb(2);

  derive2 op3; op3.setb(2); op3.setc(3); op3.show();
}

输出结果:

b=2

c=3

实际上,私有和保护这两个关键字的性质很相似,一旦用其中一个对类成员进行了定义,那外部对这个类成员是无法访问的,但在涉及到派生时,他们在派生类里的属性就改变了:

保护成员,在公有派生时仍是保护的,在私有派生时,变成私有的了,但派生类可以访问此成员;

而私有成员,在派生时,无论是私有的还是公有的,派生类都不能直接访问此成员,必须通过基类的共有成员来访问。这就是两者的关键性区分。