C++中public,protected,private派生类继承问题和访问权限问题

C++中public,protected,private派生类继承问题和访问权限问题

当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定。


1.如果子类从父类继承时使用的继承限定符是public,那么
(1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;


2.如果子类从父类继承时使用的继承限定符是protected,那么

(1)父类的public成员成为子类的protected成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;

(3)父类的public成员成为子类的protected成员,只允许子类成员访问


3.如果子类从父类继承时使用的继承限定符是private,那么

(1)父类的public成员成为子类的private成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的private成员,只允许子类成员访问;


其实这些都很有的规律的,子类public时表示最大的继承权限是public,所以子类按照原样继承,子类protected继承时最大继承权限是protected, 所以基类的public成员降级成为protected了....子类private继承时所以都成为private了, 不过子类不能访问基类的private成员..


子类默认的是private继承基类...


举个使用private继承的例子,Boost::Utility库的不可以复制的类 noncopyable


#include "boost/utility.hpp"

或者是

#include "boost/noncopyable.hpp"


  1. #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED   
  2. #define BOOST_NONCOPYABLE_HPP_INCLUDED   
  3.   
  4. namespace boost {  
  5.   
  6. //  Private copy constructor and copy assignment ensure classes derived from   
  7. //  class noncopyable cannot be copied.   
  8.   
  9. //  Contributed by Dave Abrahams   
  10.   
  11. namespace noncopyable_  // protection from unintended ADL   
  12. {  
  13.   class noncopyable  
  14.   {  
  15.    protected:  
  16.       noncopyable() {}  
  17.       ~noncopyable() {}  
  18.    private:  // emphasize the following members are private   
  19.       noncopyable( const noncopyable& );  
  20.       const noncopyable& operator=( const noncopyable& );  
  21.   };  
  22. }  
  23.   
  24. typedef noncopyable_::noncopyable noncopyable;  
  25.   
  26. // namespace boost   
  27.   
  28. #endif  // BOOST_NONCOPYABLE_HPP_INCLUDED  
#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
#define BOOST_NONCOPYABLE_HPP_INCLUDED

namespace boost {

//  Private copy constructor and copy assignment ensure classes derived from
//  class noncopyable cannot be copied.

//  Contributed by Dave Abrahams

namespace noncopyable_  // protection from unintended ADL
{
  class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      const noncopyable& operator=( const noncopyable& );
  };
}

typedef noncopyable_::noncopyable noncopyable;

} // namespace boost

#endif  // BOOST_NONCOPYABLE_HPP_INCLUDED


类 boost::noncopyable 被规定为作为私有基类来使用,它可以有效地关闭复制构造和赋值操作:


  1. #include "boost/utility.hpp"   
  2.   
  3. class please_dont_make_copies : boost::noncopyable {  
  4. public:  
  5.   void do_stuff() {  
  6.     std::cout << "Dear client, you just cannot copy me!";  
  7.  }  
  8. };  
#include "boost/utility.hpp"

class please_dont_make_copies : boost::noncopyable {
public:
  void do_stuff() {
    std::cout << "Dear client, you just cannot copy me!";
 }
};


这样就禁止了复制和赋值....



=========================================================================

c++ big three


三法则英语rule of threethe Law of The Big ThreeThe Big Three三法则三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类型有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类型内,亦即下列三个成员函数缺一不可。 [1]:

上述三个函数是特别的成员函数,假如程序员没有自行定义或是编写声明它们,那么编译器会自动地创建它们,并且会编译至应用程序内。相反地,假如程序员有定义上述三者其中一个函数,那么由编译器自动产生出来的上述三个函数是不会搭配到这个类型内。三法则(Rule of three)这个专有名词是由 Marshall Cline 于 1991 年创立的[2]


class_a.h文件

  1. #ifndef _CLASS_A_H_   
  2. #define _CLASS_A_H_   
  3.    
  4. #ifndef _MSC_VER   
  5. #undef NULL   
  6. #define NULL 0   
  7. #endif   
  8. #include <iostream>   
  9. #include <cstdlib>   
  10. #define BUFFER_SIZE 7   
  11.    
  12. using namespace std;  
  13.    
  14. class ClassA  
  15. {  
  16. public:  
  17.     // 三種建構子   
  18.     ClassA()  
  19.     {  
  20.         cout<<"ClassA():"<<endl;  
  21.         this->setAlloc(BUFFER_SIZE);  
  22.         this->setData();  
  23.     }  
  24.     ClassA(const int n)  
  25.     {  
  26.         cout<<"ClassA(const int n):"<<endl;  
  27.         this->setAlloc(n);  
  28.         this->setData();  
  29.     }  
  30.     // 複製建構子   
  31.     ClassA(const ClassA& clone)  
  32.     {  
  33.         cout<<"ClassA(const ClassA& clone):"<<endl;  
  34.         this->setAlloc(clone.m_N);  
  35.         this->setData(clone.m_pn);  
  36.     }  
  37.     // 複製指定運算子成員函式   
  38.     ClassA& operator=(const ClassA& clone)  
  39.     {  
  40.         cout<<"ClassA& operator=(const ClassA& clone)"<<endl;  
  41.         // 保護:禁止自己設值給自己   
  42.         if ( this != &clone )  
  43.         {  
  44.             this->setData(clone.m_pn);  
  45.         }  
  46.         return *this;  
  47.     }  
  48.     // 解構子   
  49.     ~ClassA()  
  50.     {  
  51.         cout<<"~Destructor!!!"<<endl;  
  52.         // 釋放記憶體   
  53.         delete [] this->m_pn;  
  54.     }  
  55.     // 配置   
  56.     void setAlloc(const int n)  
  57.     {  
  58.         this->m_N = n;  
  59.         // 配置一塊記憶體給指標   
  60.         this->m_pn = new int[this->m_N];  
  61.     }  
  62.     // 填入一堆的整數值   
  63.     void setData(int* pn = NULL)  
  64.     {  
  65.         for ( int i = 0; i < this->m_N; i ++)  
  66.         {  
  67.             // 給初始值   
  68.             if ( pn == NULL )  
  69.             {  
  70.                 this->m_pn[i] = (2 * i + 1);  
  71.             }  
  72.             // 複製指標儲存的整數值   
  73.             else  
  74.             {  
  75.                 this->m_pn[i] = pn[i];  
  76.             }  
  77.         }  
  78.     }  
  79.     // 列印顯示   
  80.     void print(void)  
  81.     {  
  82.         for ( int i = 0; i < this->m_N; i ++)  
  83.         {  
  84.             cout<<" "<<this->m_pn[i];  
  85.         }  
  86.         cout<<endl;  
  87.     }  
  88. private:  
  89.     // 指標   
  90.     int* m_pn;  
  91.     // 元素個數   
  92.     int m_N;  
  93. };  
  94.    
  95. #endif  
#ifndef _CLASS_A_H_
#define _CLASS_A_H_
 
#ifndef _MSC_VER
#undef NULL
#define NULL 0
#endif
#include <iostream>
#include <cstdlib>
#define BUFFER_SIZE 7
 
using namespace std;
 
class ClassA
{
public:
    // 三種建構子
    ClassA()
    {
        cout<<"ClassA():"<<endl;
        this->setAlloc(BUFFER_SIZE);
        this->setData();
    }
    ClassA(const int n)
    {
        cout<<"ClassA(const int n):"<<endl;
        this->setAlloc(n);
        this->setData();
    }
    // 複製建構子
    ClassA(const ClassA& clone)
    {
        cout<<"ClassA(const ClassA& clone):"<<endl;
        this->setAlloc(clone.m_N);
        this->setData(clone.m_pn);
    }
    // 複製指定運算子成員函式
    ClassA& operator=(const ClassA& clone)
    {
        cout<<"ClassA& operator=(const ClassA& clone)"<<endl;
        // 保護:禁止自己設值給自己
        if ( this != &clone )
        {
            this->setData(clone.m_pn);
        }
        return *this;
    }
    // 解構子
    ~ClassA()
    {
        cout<<"~Destructor!!!"<<endl;
        // 釋放記憶體
        delete [] this->m_pn;
    }
    // 配置
    void setAlloc(const int n)
    {
        this->m_N = n;
        // 配置一塊記憶體給指標
        this->m_pn = new int[this->m_N];
    }
    // 填入一堆的整數值
    void setData(int* pn = NULL)
    {
        for ( int i = 0; i < this->m_N; i ++)
        {
            // 給初始值
            if ( pn == NULL )
            {
                this->m_pn[i] = (2 * i + 1);
            }
            // 複製指標儲存的整數值
            else
            {
                this->m_pn[i] = pn[i];
            }
        }
    }
    // 列印顯示
    void print(void)
    {
        for ( int i = 0; i < this->m_N; i ++)
        {
            cout<<" "<<this->m_pn[i];
        }
        cout<<endl;
    }
private:
    // 指標
    int* m_pn;
    // 元素個數
    int m_N;
};
 
#endif


主函数

  1. // Headers and Macros   
  2. #ifndef _MSC_VER   
  3. #undef NULL   
  4. #define NULL 0   
  5. #endif   
  6. #include <iostream>   
  7. #include <cstdlib>   
  8. #include "class_a.h"   
  9. using namespace std;  
  10. //   
  11. //Main Function   
  12. #ifndef _MSC_VER   
  13. int  
  14. #else   
  15. void  
  16. #endif   
  17. main(int argc, char** argv)  
  18. {  
  19.     // 區塊   
  20.     {  
  21.         // 建立第一個物件   
  22.         ClassA A(BUFFER_SIZE);  
  23.         cout<<" A =>";  
  24.         A.print();  
  25.         {  
  26.             // 開始執行 ClassA(const ClassA& clone)   
  27.             ClassA B = A;  
  28.             cout<<" B =>";  
  29.             B.print();  
  30.         }  
  31.         {  
  32.             ClassA C;  
  33.             // 開始執行 ClassA& operator=(const ClassA& clone)   
  34.             C = A;  
  35.             cout<<" C =>";  
  36.             C.print();  
  37.         }  
  38.     }  
  39.     system("PAUSE");  
  40.     return  
  41. #ifndef _MSC_VER   
  42.         EXIT_SUCCESS  
  43. #endif   
  44.         ;  
  45. }  
// Headers and Macros
#ifndef _MSC_VER
#undef NULL
#define NULL 0
#endif
#include <iostream>
#include <cstdlib>
#include "class_a.h"
using namespace std;
//
//Main Function
#ifndef _MSC_VER
int
#else
void
#endif
main(int argc, char** argv)
{
    // 區塊
    {
        // 建立第一個物件
        ClassA A(BUFFER_SIZE);
        cout<<" A =>";
        A.print();
        {
            // 開始執行 ClassA(const ClassA& clone)
            ClassA B = A;
            cout<<" B =>";
            B.print();
        }
        {
            ClassA C;
            // 開始執行 ClassA& operator=(const ClassA& clone)
            C = A;
            cout<<" C =>";
            C.print();
        }
    }
    system("PAUSE");
    return
#ifndef _MSC_VER
        EXIT_SUCCESS
#endif
        ;
}


http://zh.wikipedia.org/wiki/%E4%B8%89%E6%B3%95%E5%89%87_(C%2B%2B%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88)

 

转载地址:http://blog.csdn.net/hemmingway/article/details/7858828

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值