关于C++访问控制的理解

很久以前写的一篇文章,因为另一篇博客太老了,所以转过来,不想去查那篇博客了。

 

 

private, public, protected 访问标号的访问范围。private:   访问范围:1.该类的成员函数。2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。
protected:访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数)。3.其友元函数访问。但不能被该类的对象访问。
public:    访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数)。3.其友元函数访问。4.该类的对象访问。 友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

第二:类的继承后方法属性变化。private 属性不能够被继承。private属性在子类中不可见。pravite 只对本类可见
protected 对本类和继承类可见
使用private继承,父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承,父类中的protected和public属性不发生改变;  如下所示:                                 

                          public:            protected:       private:
public继承             public             protected        不可用 
protected继承       protected        protected        不可用 
private继承            private           private            不可用 
protected继承和private继承能降低访问权限。

值得提出的是:在C++primer中存在这样一句话 :“派生类只能通过派生类对象访问其基类的protected成员,派生类对基类类型对象的protected成员没有访问权限。”(详见 C++primer 第四版特别版475页 )这句话是错的,派生类对象无法访问基类的protected成员,

派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。

一句话:继承的时候,无论用什么方式(public.protected.private),子类随时都可以访问父类的非private变量或函数。

我想总结出三点:大家记住有帮助:

1  对象只可以访问最终的(继承标号作用后)public成员。 例如public经过public继承 那么它可以是类的对象可访问,当然也可类访问。

2 类的private成员在子类中不可访问,实际上他根本就没有被继承。

3 类的protected成员只可以被类或子类访问,不可以被对象访问。

protected专门就是为继承(子类)设计的,用public继承 那么基类所有的访问标识在子类不变 。

下面是验证我说的那个断定“派生类对象无法访问基类的protected成员,派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。”

程序代码:

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

class base{
public:
 base(int value=0):base_i(value){}
 void base_pub(){cout<<"base_pub have been used !"<<endl;}
protected:
 void base_pro(){cout<<"base_pro have been used !"<<endl;}
private:
 int base_i;
};

class derived:public base{
public:
  derived(int data=0):derived_i(data){}
 void derived_pub(){cout<<"derived_pub have been used: "<<endl;base_pro();derived_pro();}
protected:
 void derived_pro(){cout<<"derived_pro have been used;"<<endl;}
private:
 int derived_i;

};


int _tmain(int argc, _TCHAR* argv[])
{
 base b(1000);
 derived d(999);
 //b.base_pub();
 d.base_pro();
 d.derived_pub();
 //d.derived_pro();
 return 0;
}

编译结果:

1>    d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明
1>d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(39) : error C2248: “base::base_pro”: 无法访问 protected 成员(在“base”类中声明)
1>     d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(15) : 参见“base::base_pro”的声明
1>     d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明

当然程序改动正确的结果是:

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

class base{
public:
 base(int value=0):base_i(value){}
 void base_pub(){cout<<"base_pub have been used !"<<endl;}
protected:
 void base_pro(){cout<<"base_pro have been used !"<<endl;}
private:
 int base_i;
};

class derived:public base{
public:
 
 derived(int data=0):derived_i(data){}
 void derived_pub(){cout<<"derived_pub have been used: "<<endl;base_pro();derived_pro();}
protected:
 void derived_pro(){cout<<"derived_pro have been used;"<<endl;}
private:
 int derived_i;

};


int _tmain(int argc, _TCHAR* argv[])
{
 base b(1000);
 derived d(999);
 //b.base_pub();
 //d.base_pro();
 d.derived_pub();
 //d.derived_pro();
 return 0;
}

程序截图:

这个小程序 大家可以随便修改测试,基本可以做个演示实验的小程序。

好了,还有那些地方不明白就修改程序的哪些地方,看看实践的结果和我这些讲解是不是一样吧。如果有错,你一定要告诉我哦。 谢谢大家。

原文地址:https://www.cnblogs.com/cslave/p/2586645.html