《C++ Primer 4th》面向对象编程读书笔记---protected成员

好久没看C++的基础性的知识了,很多东西都忘了。今天在其它地方看到关于C++类protected的地方不太记得。翻了一下《C++ Primer 4th》,发现迷惑的地方更多了,真的是能力渣渣的啊,基础真的不行。

------------------分割线---------------------

类设计与受保护成员
如果没有继承,类只有两种用户:类本身的成员和该类的用户。将类划分为private 和 public 访问级别反映了用户种类的这一分隔:用户(使用这个类的程序,包括类对象)只能访问public接口,类成员和友元既可以访问public成员也可以访问private成员。
有了继承,就有了类的第三种用户:从类派生定义新类的程序员(派生类)。派生类的提供者通常(但并不总是)需要访问(一般为private的)基类实现,为了允许这种访问而仍然禁止对实现的一般访问,提供了附加的protected访问标号。类的protected部分仍然不能被一般程序员(使用这个类的用户)访问,但可以被派生类访问。只有类本身和友元可以访问基类的private部分,派生类不能访问基类的private成员。
定义类充当基类时,将成员设计为public的标准并没有改变:仍然是接口函数应该为public而数据一般不应为public。被继承的类必须决定实现的哪些部分声明为protected而哪些部分声明为private。希望禁止派生类访问的成员应该设为private,提供派生类实现所需操作或数据的成员应设为protected。换句话说,提供给派生类型的接口是protected成员和public成员的组合。


protected成员

可以认为protected访问标号中private和public的混合。

1、像private成员一样,protected成员不能被类的用户访问

2、像public成员一样,protected成员可被该类的派生类访问

此外,protected还有另一重要性质。

派生类可以通过派生类对象访问基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。

配上代码理解大概就是如下(原代码链接:http://blog.csdn.net/luoruiyi2008/article/details/7179788) :

#include <iostream>

using std::cout ;
using std::endl ;


class Base
{
public:
	Base(){};
	virtual ~Base(){};
protected:
	int int_pro;
} ;


class A : public Base
{
public:
	A(){};
	A(int da){int_pro = da;} //派生类(A)可以直接访问基类(Base)的protected成员(int_pro)
	void Print(A &obj){obj.int_pro = 24;} //派生类对象(obj)可以访问基类的protected成员(int_pro)
	void PrintPro(){cout << "The proteted data is " << int_pro <<endl;} //派生类(A)可以直接访问基类(Base)的protected成员(int_pro)
	void PrintBasePro(Base &obj){cout << "The protected data is " << obj.int_pro << endl ;} //派生类(A)对基类类型对象(obj)protected成员(int_prot)没有特殊访问权限,因此加上此句,代码编译不通过。
} ;


int main(void)
{
	A aObj;
	A aObj2(5);
	aObj2.PrintPro();
	aObj.Print(aObj2);
	aObj2.PrintPro();

	return 0 ;
}

你可能感兴趣的:(《C++ Primer 4th》面向对象编程读书笔记---protected成员)