Chinaunix首页 | 论坛 | 博客
  • 博客访问: 496180
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1916
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-11 22:01
个人简介

从事实时计算多年,熟悉jstorm/spark/flink/kafka/rocketMq, 热衷于开源,希望在这里和前辈们一起学习与分享,得到长足的进步!邮箱:hustfxj@gmail.com 我的githup地址是:https://github.com/hustfxj。欢迎和大家一起交流探讨问题。

文章分类

全部博文(80)

文章存档

2017年(11)

2015年(3)

2014年(33)

2013年(33)

分类: C/C++

2013-10-28 15:07:11

 1.各类的private成员特性

      publicprivateprotected继承只是影响到基类的public成员和protected成员。对于基类的private只有基类的成员可以访问。就算是限制最松的public继承,在派生类中的成员也不能访问基类的private成员,只能通过调用基类的非private接口来访问。所以基类的private成员和派生类的private成员在派生类中还是有区别的。如下:

2.访问级别的改变规则
      再次强调public、private、protected继承只是影响到基类的public成员和protected成员。

①如果是public继承,基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。

②如果是pprotected继承,基类的public成员和protected成员在派生类中为protected成员。

③如果是private继承,基类的public成员和protected成员在派生类中为private成员。

      注意这里private继承的时候,private的成员是可以访问基类中publicprotected成员的。但是是在定义的接口中访问,不是对象直接访问。

点击(此处)折叠或打开

  1. <SPAN style="FONT-SIZE: 14px">class Base
  2. {
  3. public:
  4.     Base(int a):_a(a),protected_a(a){}
  5.     void set_a(int a){_a=a;}
  6. protected:
  7.     int protected_a;
  8. private:
  9.     int _a;
  10. };
  11. class Derived:private Base
  12. {
  13. public:
  14.     Derived(int a,int b):Base(a),_b(b){}
  15.     void print_protected_a(){cout << protected_a;}
  16. private:
  17.     int _b;
  18. };
  19. </SPAN>

这段程序是正确的!

       那么protected继承和private继承的区别在哪里?关键在于派生类的派生类的访问权限不一样。如下面两段程序:

点击(此处)折叠或打开

  1. class CSample1 {
  2. protected:
  3.     void printProtected() {}
  4. public:
  5. void printPublic() {}
  6. };
  7. class CSample2 : protected CSample1 {};
  8. class CSample3 : public CSample2 {
  9.    void print3() {
  10.       printProtected();
  11.       printPublic();
  12. }
  13. };
  14.   
  15. class CSample1 {
  16. protected:
  17.   void printProtected() {}
  18. public:
  19.   void printPublic() {}
  20. };
  21. class CSample2 : private CSample1 {};
  22. class CSample3 : public CSample2 {
  23.   void print3() {
  24.     printProtected(); // 编译错误,不可以调用该函数
  25.     printPublic(); // 编译错误,不可以调用该函数
  26.   }
  27. };

3. using声明

       如果进行privateprotected继承,则基类成员的访问级别在派生类中比在基类中更受限:


点击(此处)折叠或打开


     
  1. class
    Base{ 

  2. public: 
  3.     std::size_t size() const {return
    n;} 
  4.   
  5. protected: 
  6.     std::size_t n; 
     
  7. } 
  8. class Derived : private
    Base{...};
 

在这一继承层次中,sizeBase中为public,但在Derived中为private。为了使sizeDerived中成为public,可以在Derivedpublic部分增加一个using声明。如下这样改变Derived的定义,可以使size成员能够被用户访问,并使n能够被从Derived派生的类访问:

点击(此处)折叠或打开

  1. class Derived : private Base{
  2. public:
  3.     using Base::size;
  4. privated:
  5.     using Base::n;
  6. }

4.struct与class的区别

       structclass保留字定义的类具有不同的默认访问级别。同样,默认继承访问级别根据使用哪个保留字定义派生类也不相同。使用class保留字定义的派生类默认具有private继承,而用struct保留字定义的类默认具有public继承:  有一种常见的误解认为用struct保留字定义的类与用class定义的类有更大的区别。实际上它们唯一的不同只是①默认的成员保护级别和②默认的派生保护级别,除此之外,再也没有其他的区别。

点击(此处)折叠或打开

  1. class Base{/*...*/}
  2. struct D1 : Base{/*...*/}; //public inheritance by default
  3. class D2 : Base{/*...*/}; //private inheritance by default

 

阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~