// 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
//优先级大的可以改变优先级小的
C++ derived class access specifier