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

xiaoxiao2021-02-28  56

//例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 */
转载请注明原文地址: https://www.6miu.com/read-85426.html

最新回复(0)