C++ 例4.1 私有继承的访问规则举例1

//例4.1 私有继承的访问规则举例1.
#include<iostream>
using namespace std;
class Base{                 //声明基类Base
	public:
	  void setx(int n)      //正确,成员函数setx可以访问本类的私有成员x
	  {x = n;
	  }	
	  void showx()          //正确,成员函数showx可以访问本类的私有成员x
	  {cout<<x<<endl;	
	  }
	private:
	int x;
};
class Derived:private Base{// 声明基类Base的私有派生类Derived
  public:
  	void setxy(int n,int m)
	{
		setx(n);  //基类的setx函数在派生类中为私有成员,派生类成员函数可以访问
		y=m;      //正确,成员函数setxy可以访问本类的私有成员y
	}
	void showxy()
	{
	  //cout<<x;  //错误,派生类成员函数不能直接访问基类的私有成员x
	  cout<<y<<endl;//正确,成员函数showxy可以访问本类的私有成员y
	
	}
	private:
	  int y;
};
int main()
{
	Derived obj;
	//obj.setx(10);   //错误,setx在派生类中为私有成员,派生类对象不能访问
	//obj.showx();    //错误,showx在派生类中为私有成员,派生类对象不能访问
	obj.setxy(20,30); //正确,setxy在类derived为公有成员,派生类对象能访问
	obj.showxy();     //正确,showxy在类derived为公有成员,派生类对象能访问
	return 0;
}

/*
	本例中首先定义了一个类Base,它有一个私有数据成员x和两个公有成员函数setx和
showx。将类Base作为基类,派生出一个类Derived。派生类Derived除继承了基类的成员
外,还有只属于自己的成员:私有数据成员y,公有成员函数setxy和showxy。继承方式关
键字是private,所以这是一个私有继承。
	由于是私有继承,所以基类Base的公有成员函数setx和showx被派生类Derived私
有继承后,成为派生类Derived的私有成员,只能被类Derived的成员函数访问,不能被派生
类的对象访问。所以在main函数中,对函数obj.setx和obj.showx的调用是错误的,因为
这两个函数在派生类Derived中已成为私有成员。
	需要注意的是,虽然函数setx和showx被派生类继承,但它们仍然是Base的公有成
员,因此以下的调用是正确的:
	Base base_obj;
	base_obj.setx(2);
	
	虽然派生类Derived私有继承了基类Base,但它的成员函数并不能直接访问Base的私
有数据x,只能访问两个公有成员函数。所以在类Derived的成员函数setxy中访问Base
的公有成员函数setx是正常的,但在成员函数showxy中直接访问Base的私有成员x是错
误的。但是可以通过基类提供的公有成员函数showx间接访问私有成员x。
	例如将函数main中两条错误词句去掉,并且把例中函数showxy改成如下形式:
	void showxy()
	{ showx();
	  cout<<y<<endl;
	}
	重新编译,程序将顺利通过。可见基类中的私有成员既不能被派生类的对象访问,也
不能被派生类的成员函数访问,只能被基类自己的成员函数访问。因此,我们在设计基类时,
总要为它的私有数据成员提供公有成员函数,如本例的成员函数showx等,以便使派生类
可以间接访问这些数据成员。
   修改后,程序运行结果如下:
   20
   30
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值