C++ derived class access specifier

// DerivedAccessSpecifier.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class base
{
public:
	int pub_a = 0;
private:
	int pri_b = 0;
protected:
	int pro_c = 0;
};

class pub_derived : public base
{
public:
	int use_pub(){ return pub_a; }    //public派生类可以访问父类的public成员
	//int use_pri(){ return pri_b; }  //public派生类不可以访问父类的private成员
	int use_pro(){ return pro_c; }    //public派生类可以访问父类的protected成员
};

class pri_derived : private base
{
public:
	int use_pub(){ return pub_a; }    //private派生类可以访问父类的public成员
	//int use_pri(){ return pri_b; }  //private派生类不可以访问父类的private成员
	int use_pro(){ return pro_c; }    //private派生类可以访问父类的protected成员

};

class pro_derived : protected base
{
public:
	int use_pub(){ return pub_a; }    //protected派生类可以访问父类的public成员
	//int use_pri(){ return pri_b; }  //protected派生类不可以访问父类的private成员
	int use_pro(){ return pro_c; }    //protected派生类可以访问父类的protected成员
};

//由上可知,派生时的access specifier对派生类中的成员没有影响

class dd_pub : public pub_derived
{
public:
	int dd_use_pub(){ return pub_a; }  //yes
	//int dd_use_pri(){ return pri_b; }  //no
	int dd_use_pro(){ return pro_c; }  //yes
};

class dd_pri : public pri_derived
{
public:
	//int dd_use_pub(){ return pub_a; } //no
	//int dd_use_pri(){ return pri_b; } //no
	//int dd_use_pro(){ return pro_c; } //no
};

class dd_pro : public pro_derived
{
public:
	int dd_use_pub(){ return pub_a; }  //yes
	//int dd_use_pri(){ return pri_b; }  //no
	int dd_use_pro(){ return pro_c; }  //yes
};



int _tmain(int argc, _TCHAR* argv[])
{
	pub_derived a;
	pri_derived b;
	pro_derived c;
	
	cout << a.pub_a << endl;    //yes
	//cout << b.pub_a << endl;  //no
	//cout << c.pub_a << endl;    //no

	return 0;
}

//由上可知,派生时的access specifier对派生类的users有影响,users包括:派生类的派生类,派生类的对象。
//即影响派生类的interface
//public :   父类的public、private、protected不变
//private:    父类的public、private、protected都变成private
//protected:  父类的public变成protected,private不变,protected还是protected
//即优先级为: private > protected > public
//优先级大的可以改变优先级小的

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。