//例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
*/
C++ 例4.1 私有继承的访问规则举例1
最新推荐文章于 2023-04-18 14:09:55 发布