C++中的派生类对基类成员的访问问题

C++中派生类对基类成员的访问形式主要有以下两种:
1、内部访问:由派生类中新增成员对基类继承来的成员的访问。
2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。

1、私有继承的访问规则
当类的继承方式为私有继承时,基类的public成员和protected成员被继承后成为派生类的private成员,派生类的其它成员可以直接访问它们,但是在类的外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类的成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。
在这里插入图片描述

#include<iostream>
using namespace std;
class 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;//正确,成员函数showxy可以访问本类的私有成员y
}
void showxy()
{
cout<<x;//错误,派生类成员函数不能直接访问基类的私有成员x。
cout<<y<<endl;//正确,成员函数showxy可以访问本类的私有成员

}
privateint y;
};
int main()
{
Derived obj;
obj.setx(10);//错误,setx在派生类中为私有成员,派生类对象不能访问。
obj.showx();//错误,showx在派生类中为私有成员,派生类对象能不能访问
obj.setxy(20,30);//正确,setxy在类derived为公有成员,派生类对象能访问。
obj.showxy();//正确,showxy在类derived中为公有成员,派生类对象能访问
return 0}

公有继承的访问规则
当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其它成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问继承来的public成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数直接访问它们。公有继承的访问规则总结如下:
在这里插入图片描述

#include<iostream>
using namespace std;
class Base {
public:
void setxy(int m,int n)
  {
   x=m;
   y=n;
 }
void showxy()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
provate:
int x;
protect:
int y;
};
class Derived :public Base{//声明,基类Base的公有类继承Derived
public:
void setxyz(int m ,int n,int 1)
{
setxy(m,n);//函数setxy在派生类中是public的成员,派生类成员函数可以直接访问
z=1;
}
void showxyz()
{
cout<<"x="<<x<<endl;//错误,x在derived中为不可直接访问成员,在Base中x为私有成员。
cout<<"y="<<y<<endl;//正确,y在edrived中为保护成员,派生类成员函数可以访问
cout<<"z="<<z<<endl;
}
privateint z;
};
int main()
{
Derived obj;
obj.setxyz(30,40,50);
obj.showxyz();//正确,函数shouxyz在类derived中为公有成员,派生类能访问他
obj.y=60;//错误,y在类derived中为保护成员,派生类对象不能访问他
return 0}

保护继承的访问规则
当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其它成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象访问它们。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类中的private成员。保护继承的访问规则总结如下:
在这里插入图片描述

#include<iostream>
using namespace std;
class Base{
public:
int z;
void setx(int i)
{x=i;}
int getx()
{return x;}
private:
int x;
protected:
int y;

};
class Derived :protected Base{
public:
int p;
void setall(int a,int b,int c,int d,int e,int f)
void show();
private:
int m;
protected
int n;
};
void Derived ::setall (int a,int b,int c,int d,int e,int f)
{
x=a;//错误,x为基类的私有成员,派生类不能直接访问,可修改为setx(a)
y=b;//正确,y在基类中为保护沉管,派生类对象能直接访问
z=c;//正确,z在派生类中为保护成员,派生类对象能访问他
m=d;
n=e;
p=f;
}
void Derived ::show()
{
cout<<"x="<<x<<endl;//错误,在派生类中x我不可直接访问成员
cout<<"x="<<getx()<<endl;//正确,getx在派生类derived中为保护成员,派生类对象能直接访问他
cout<<"y="<<y<<endl;//正确,y在派生类中为保护成员,派生类函数能直接访问他
cout<<"z="<<z<<endl;//正确,z在派生类中为保护成员,派生类函数能直接访问他
cout<<"m="<<m<<endl;//正确,/m在派生类中为私有成员,派生类函数能直接访问他
cout<<"n="<<n<<endl;//正确,n在派生类中为保护成员,派生类函数能直接访问他
}
int main()
{
Derived obj;
cout<<"y="<<obj.y<<endl;//错误,y为派生类的保护成员,派生类对象不能直接访问他
cout<<"p="<<obj.p<<endl;//正确,p为derived的公有成员,派生类对象能直接访问他
return 0}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值