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. namespace boost {
  4. //  Private copy constructor and copy assignment ensure classes derived from
  5. //  class noncopyable cannot be copied.
  6. //  Contributed by Dave Abrahams
  7. namespace noncopyable_  // protection from unintended ADL
  8. {
  9. class noncopyable
  10. {
  11. protected:
  12. noncopyable() {}
  13. ~noncopyable() {}
  14. private:  // emphasize the following members are private
  15. noncopyable( const noncopyable& );
  16. const noncopyable& operator=( const noncopyable& );
  17. };
  18. }
  19. typedef noncopyable_::noncopyable noncopyable;
  20. } // namespace boost
  21. #endif  // BOOST_NONCOPYABLE_HPP_INCLUDED

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

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

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

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

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

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)

C++中public,protected,private派生类继承问题和访问权限问题的更多相关文章

  1. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  2. C++中public,protected,private访问

    对于公有继承方式: (1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员:(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员:(3 ...

  3. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  4. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  5. C++派生类继承的理解

    #include<iostream> using namespace std; class Base{ public: Base() { a=; cout<<"Bas ...

  6. C++继承中的public/protected/private

    今天杨老师讲到C++的继承的时候用一个表来说明子类继承父类后访问权限的变化,如下表: 注:在本类中,protected与private是相同的,但protected可以被继承,而private却不行. ...

  7. 继承下public,protected,private访问权限

    C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...

  8. 快速理解类的访问控制(public,protected,private)

    接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...

  9. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

随机推荐

  1. CSS3绘制弹球动画效果

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. android部分开发摘要

    Async 异步  不会阻塞当前线程sync  同步 数据库是应用软件|结构化数据存储  JDBC  SQL ellipsis 省略 content provider   URI thread--lo ...

  3. 【转】Web前端浏览器兼容初探

    原文地址:http://blog.jobbole.com/38638/ 前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: ...

  4. inline-block 左边固定,右边自适应

    <body> <div class="col-md-4 left"> <div class="logo">默沙东盲讲< ...

  5. 【深入Java虚拟机】之二:Java垃圾回收机制

    [深入Java虚拟机]之:Java垃圾收集机制 对象引用 Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例.谈到Java堆中的垃圾回收,自然要谈到引用.在JDK ...

  6. random模块

    如下 #!/usr/bin/env python # encoding: utf-8 import sys import platform print (platform.python_version ...

  7. python学习笔记10(Python的内存管理)

      用这张图激励一下自己,身边也就只有一位全栈数据工程师!!! 32. Python的内存管理 1. 对象的内存使用 对于整型和短字符串对象,一般内存中只有一个存储,多次引用.其他的长字符串和其他对象 ...

  8. Android Studio高级配置

    转载:http://www.jianshu.com/p/4243f3b52644   Android Studio 提供了一个非常方便的功能帮助我们导入或者导出设置.因此我们在安装一个新的Androi ...

  9. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

  10. python-汉诺塔递归实现

    摘录自廖雪峰老师教程下的评论,个人备忘,脑细胞已死光 def move(from,to): #将盘子从from移动到to,动画效果需要脑补 print(from,'->',to) def han ...