派生类成员对基类成员的访问权限

1. public 继承

派生类成员可以直接访问 基类的public成员,也可通过派生类对象直接访问;

派生类成员可以直接访问 基类的 protected 成员,但不能通过派生类对象访问基类的protected 成员(当然基类的对象也不可以)

派生类成员不可以直接访问基类的 private 成员。

基类的public protected 成员类似成为派生类的 public protected 成员;基类的private成员在派生类内无法访问!

#include <iostream>

class Base
{
public:
	void BaseShow_public()
	{
		std::cout << "BaseShow_public()" << std::endl;
	}

protected:
	void BaseShow_protected()
	{
		std::cout << "BaseShow_protected()" << std::endl;
	}

private:
	void BaseShow_private()
	{
		std::cout << "BaseShow_private()" << std::endl;
	}
};

class Derived : public Base
{
public:
	void DerivedShow()
	{
		BaseShow_public();
        BaseShow_protected();
        //BaseShow_private(); // error
	}
};

int main()
{
	Derived d;
	d.DerivedShow();
	d.BaseShow_public();

    Base b;
    b.BaseShow_protected(); //error

	return 0;
}

2. protected 与 private 继承

派生类成员可以访问基类的 public protected 成员,而不能访问 private 成员。

当然派生类对象就不能访问基类的任意成员了。

protected 继承时,基类的 public protected 成员成为派生类的 protected 成员;

private 继承时,基类的 public protected 成员成为派生类的 private 成员;

而 基类的 private 成员两种情况下 在派生类内 都无法访问!

class Derived : private Base
{
public:
	void DerivedShow()
	{
		BaseShow_public();
		BaseShow_protected();
		// BaseShow_private();
	}
};

所以,进一步的区别体现在 派生类的派生类(新增一个公有继承于 Derived 的新类):

class DDerived : public Derived
{
public:
	void DDerivedShow()
	{
		BaseShow_public();
		BaseShow_protected();
	}
};

当 Derived 保护继承于 Base 类时,Base 的public protected 成员 成为 Derived 的 protected 成员,所以 DDerived 成员可以访问之;

当 Derived 私有继承于 Base 类时,Base 的public protected 成员 成为 Derived 的 private 成员,所以 DDerived 成员 不可访问之。

3. something brief

通过派生类对象,只能访问 public 继承的 基类的public 成员;

无论是哪种继承方式,派生类成员可以直接访问除了 基类的 private 成员外的所有成员。

4. using 改变基类成员在派生类的访问权限

注意:不能用于基类的私有成员!(如下面代码段在 vs2019 会报错)

#include <iostream>

class Base
{
private:
	void BaseShow_private()
	{
		std::cout << "BaseShow_private()" << std::endl;
	}
};

class Derived : public Base
{
public:
	using  Base::BaseShow_private; //vs2019报错,提示: Base::BaseShow_private已声明不可访问
};

int main()
{
	Derived d;
	Base b;
	return 0;
}

下面有一个 using 改变基类成员访问特性的例子:

正常情况下,这里经过 private 继承,BaseShow_protected 成为Derived的私有成员,通过Derived对象访问 BaseShow_protected成员是非法的,但是加上 using 声明改变了 BaseShow_protected对于Derived类的访问权限,下面代码可以正常执行了。

#include <iostream>

class Base
{
protected:
	void BaseShow_protected()
	{
		std::cout << "BaseShow_protected()" << std::endl;
	}
};

class Derived : private Base
{
public:
	using Base::BaseShow_protected;

};

int main()
{
	Derived d;
	d.BaseShow_protected();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值