Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477416
  • 博文数量: 47
  • 博客积分: 2044
  • 博客等级: 上尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-11 15:50
文章分类

全部博文(47)

文章存档

2012年(1)

2011年(19)

2010年(27)

我的朋友

分类: C/C++

2011-06-15 10:32:31

 
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 !"<
protected:
 void base_pro(){cout<<"base_pro have been used !"<
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: "<
protected:
 void derived_pro(){cout<<"derived_pro have been used;"<
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 !"<
protected:
 void base_pro(){cout<<"base_pro have been used !"<
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: "<
protected:
 void derived_pro(){cout<<"derived_pro have been used;"<
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;
}

 

程序截图:

 

 

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

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

阅读(5116) | 评论(0) | 转发(0) |
0

上一篇:linux test 命令

下一篇:ps -aux

给主人留下些什么吧!~~