protected、public、private

一、protected成员

1. 受保护的成员的可访问性

  • 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。
  • 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员
  • 派生类的成员及其友元只能访问派生类对象中的基类部分的protected成员,不能访问普通的基类对象中的protected成员

借助下面的例子加深理解:

class Base {
protected:
	int proc = 0;
};

class Derv : public Base {
	void set_base_false()
	{
		Base b;
		b.proc = 1; 		//[Error] ‘int Base::proc‘ is protected
	}
	void set_base_true()
	{
		Derv d;
		d.proc = 1;
	}
	void set_base_true2()
	{
		proc = 1;			//访问该派生类继承而来的proc成员
	}
};

二、三种继承方式

1. 派生访问说明符

对于派生类的成员及友元能否访问其直接基类的成员没什么影响

目的:控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限

2. 继承方式不影响派生类的成员及其友元访问基类的成员

class Base {
public:
	void pub_mem();
protected:
	int prot_mem;
private:
	int priv_mem;
};

//公有继承
class Pub_derv : public Base {
	int f1() { pub_mem(); }
	int f2() { return prot_mem; }
	int f3() { return priv_mem; }		//错误:派生类不可访问private成员
};

//私有继承
class Priv_derv : private Base {
	int f1() { pub_mem(); }
	int f2() { return prot_mem; }
	int f3() { return priv_mem; }		//错误:派生类不可访问private成员
};

3. 继承方式影响派生类对象及其派生类访问基类的成员

公有继承:派生类中(从基类中)继承而来的成员都遵循其原有的访问说明符

私有继承:派生类中(从基类中)继承而来的成员的访问说明符都是private

保护继承:派生类中(从基类中)继承而来的成员,若其在基类中的访问说明符是public,则在派生类中的访问说明符变为protected

	Pub_derv d1;		//公有继承而来的派生类对象d1
	Priv_derv d2;		//私有继承而来的派生类对象d2
	d1.pub_mem(); 		//正确:pub_mem()在派生类中是public的
	cout << d1.prot_mem << endl; 	//错误:prot_mem在派生类中是protected的,但类的对象无法访问protected成员
	d2.pub_mem(); 		//错误:pub_mem()在派生类中是private的

补充:其实题目中所说的基类的成员是指继承到派生类中的基类的成员(即,派生类的成员的基类部分

三、派生类向基类转换的可访问性

0. 影响因素

使用该转换的代码

派生类的派生访问说明符

1. D继承自B

  • D公有地继承B时,用户代码才能使用派生类向基类的转换(用户代码可访问B的公有成员)
  • 如果B是D的直接基类,则D的成员和友元可以使用派生类向基类的转换(D的成员和友元可访问B的公有成员)
  • D不是私有地继承B时,则D的派生类的成员和友元可以使用D向B的类型转换(D的派生类的成员和友元可访问B的公有成员)

小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。

时间: 2024-10-14 03:19:11

protected、public、private的相关文章

C++类:private、public、friend、protected的区别

private和public的作用是让编译器帮你检查某些模块是否使用了他没权限使用的模块,也就是生成可执行代码的时候做权限检查.比如,公司里各个部门有自己私有的信息,财务部可以看所有员工工资,而销售部不可以,普通员工也不可以. 可不可以访问都是认为规定的,而且在写代码的时候程序是不会执行的,因此需要在生成代码的时候做一些检查,就像语法错误在编译的时候被检查出来一样,因为人规定了代码该如何写.访问控制也是在编译的时候检查,c++采用了private,public,protected,以及frien

private、 protected、 public、 internal 修饰符的访问权限

3. 简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问.protected : 保护成员,该类内部和继承类中可以访问.public : 公共成员,完全公开,没有访问限制.internal: 在同一命名空间内可以访问.4. 写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID可能不是连续的.)select top 10 * from A

Swift-----访问控制(private、fileprivate、internal、public、open)

在swift中,访问修饰符有五种,分别是:private.fileprivate.internal.public.open.其中fileprivate和open是swift 3 新添加的.由于之前的访问控制符是基于文件的,不是基于类的.这样会有问题,故swift 3 增加了两个修饰符,对原来的private.public进行了细分. 从高到低的排序如下: open > public > interal > fileprivate > private (1)private:修饰的属性

VBS:Class、Public、Private

Class Circle     Public r         Private mArea        Public Sub Init(a)        r=a    End Sub        Public Function Area()        If mArea="" Then             mArea=Atn(1)*4*r*r         End If        Area=mArea    End Function            Priv

oop_day05_package、public、static、final、内部类

--20150813 1.方法的重写: 1)父子类中,方法签名相同,方法体不同 2)重写方法被调用时,看对象的类型 3)遵循"两同两小一大"规则: 3.1)两同: 方法名相同,参数列表相同 3.2)两小: 子类的返回值类型小于或等于父类-----一般都是等于 3.2.1)返回类型为void时,必须相同               3.2.2)返回类型为基本类型时,必须相同               3.2.3)返回类型为引用类型时,需小于或等于 子类抛出的异常小于或等于父类 3.3)

typescript中private、public、protected修饰符

1.默认为public 2.当成员被标记为private时,它就不能在声明它的类的外部访问,比如: class Animal { private name: string; constructor(theName: string) { this.name = theName; } } let a = new Animal('Cat').name; //错误,'name'是私有的 3.protected和private类似,但是,protected成员在派生类中可以访问 class Animal

JavaScript实现类的private、protected、public、static以及继承

基础知识 JavaScript中的类 JavaScript实际上是一种弱类型语言,与C++和Java等语言不同.因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比如写一款游戏,如果我们不停地调用函数来完成创建角色,移动角色的话,那会是什么样的呢?可能会出现非常多的重复代码,因此我们需要一个类来统一这些代码.所谓的类,就是把程序中的代码分类,比如说游戏中的关于角色的代码算作一类,游戏背景算作一类,游戏特效又是一类.这样一来,我们对类进行操作,就不会使

Java中private、public、static、protetced、abstract、final

abstract (抽象的) 1.abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的一定是抽象类; 2.被abstract修饰的类不能直接实例化,需要通过子类实现,所有抽象类一定有子类. 3.继承抽象类的子类必须重写抽象类中的被abstract修饰的抽象方法,如果不继承就必须把自己变成抽象的子类. final (最终的) final可以修饰类,成员变量,成员方法,局部变量/形参. 2.fi

private、public、this关键字

private关键字 概念:私有的,一种权限修饰符,用来修饰类的成员 特点:被修饰的成员只能在本类中访问 用法: - 1. private 数据类型 变量名: - 2. private 返回值类型 方法名(参数列表){} public关键字 公共的,访问权限修饰符,用来修饰类,成员变量,成员方法等,被修饰的内容可以在任意类中访问 this关键字 表示本类对象的引用,本质是一个对象 - 特点 // 每一个普通方法都有一个this,谁调用该方法,this就指向谁 - 用法 // this.属性名 /