C++中三种继承关系以及访问权限

本文探讨了C++中的继承概念,包括公有、私有和保护继承,以及它们如何影响基类成员在派生类中的访问权限。示例展示了不同继承方式下,派生类如何访问基类的公有、保护和私有成员,强调了封装和继承在面向对象编程中的重要性。
摘要由CSDN通过智能技术生成
using namespace std;
class BaseA {
private:
	int a;
	int funA3() { cout << "A3" << endl; }
public:
	void funA() { cout << " funA" << endl; }
	int getA1() { return a; }
protected:
	int getA2() { funA3(); getA1(); }
};
class pbA :public BaseA
{
private:
	int b;
public:
	void funB() { cout << " funB" << endl; }
	void funB1() { funA(); getA2(); getA1(); }  //可以访问基类的公有和保护成员,但私有成员只能通过方法访问。
};
class C :private BaseA
{
private:
	int c;
public:
	void funC() { cout << " funC" << endl; }
	void funC1() { funA(); getA1(); getA2(); }//基类的公有和保护都变为私有,私有不能调用
};
class C3 :private C {
public:
	void funC3() { funC(); funC1();}  
	//内部调用只能使用第二代的函数,因为第一代方法的在第二代成为私有。想要调用只能通过第二代的方法调用第一代的
};
class D :protected BaseA {
private:
	int d;
public:
	void funD() { funA();getA1(); getA2(); }//基类的公有和保护都变为保护,私有不能调用
};
class D3 :protected D {
public:
	void funD3() { funA(); getA1(); getA2(); funD(); }  
	//内部可以调用第二代,第三代的方法
};
int main()
{
	//此处a对象只能访问公有的函数,其它私有和保护不能被外界访问,
	//私有和保护只能类内访问(自用),即类内的函数可以调用私有和保护成员
	//封装特性,暴露外界的只有公有部分。
	BaseA a;
	a.funA();
	a.getA1();  
	//a.funA3(); //
	//a.getA1(); 均不能访问
	cout << "=================================================" << endl;
	//公有继承,基类的公有为派生类的公有,私有只能通过基类的公有方法和保护方法访问
	//基类的保护为派生类的保护,因此也只能内部使用(即派生类的内部函数调用私有和保护)
	pbA pb;
	pb.funA(); 
//	pb.a; //不能直接访问基类的a,只能通过基类的保护和公有方法访问
//	pb.getA2();不能直接访问基类的保护成员,因为 它是保护的,外界看不到
	pb.getA1();
	a = pb;//可以隐式向上转换, is-a关系。
	cout << "=================================================" << endl;
	//私有继承,基类的公有为派生类的私有,保护为派生的保护,私有只能通过基类的公有和保护访问。
	C c;
	c.funC();
	c.funC1();   //只能调用这几种,私有继承的全为私有,类外不可访问,只能在派生类的内部自用。
	//a = c; //不能隐式向上转换

	cout << "=================================================" << endl;
	//保护继承,基类公有和保护都成为派生的公有和保护,私有只能通过基类的公有和保护访问。
	D d;
	d.funD();//只能调用这几种,类外不可访问,只能在派生类的内部自用。
	//a = d;  //能隐式向上转换,但只能在派生类中
	cout << "=================================================" << endl;
	//注意:使用私有继承,第三代将不能使用基类的接口,因为第二代将基类的公有变成私有,第三代中第一代为私有的私有
	//第三代的对象不能使用 基类的方法,只能在自己的内部使用。
	C3 c3;
	c3.funC3(); //只能调用自己的
	//使用保护继承,基类的公有接口在第二代为保护,到了第三代依然是保护,可以使用。
	D3 d3;
	d3.funD3(); // 只能调用自己的  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值