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"
- #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 被规定为作为私有基类来使用,它可以有效地关闭复制构造和赋值操作:
- #include "boost/utility.hpp"
- class please_dont_make_copies : boost::noncopyable {
- public:
- void do_stuff() {
- std::cout << "Dear client, you just cannot copy me!";
- }
- };
这样就禁止了复制和赋值....
=========================================================================
三法则(英语:rule of three,the Law of The Big Three,The Big Three;三法则,三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类型有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类型内,亦即下列三个成员函数缺一不可。 [1]:
上述三个函数是特别的成员函数,假如程序员没有自行定义或是编写声明它们,那么编译器会自动地创建它们,并且会编译至应用程序内。相反地,假如程序员有定义上述三者其中一个函数,那么由编译器自动产生出来的上述三个函数是不会搭配到这个类型内。三法则(Rule of three)这个专有名词是由 Marshall Cline 于 1991 年创立的[2]。
class_a.h文件
- #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
主函数
- // 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
- ;
- }
C++中public,protected,private派生类继承问题和访问权限问题的更多相关文章
- 【转载】C++中public,protected,private访问
第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...
- C++中public,protected,private访问
对于公有继承方式: (1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员:(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员:(3 ...
- 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意
大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...
- C++:继承访问属性(public/protected/private)
• 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...
- C++派生类继承的理解
#include<iostream> using namespace std; class Base{ public: Base() { a=; cout<<"Bas ...
- C++继承中的public/protected/private
今天杨老师讲到C++的继承的时候用一个表来说明子类继承父类后访问权限的变化,如下表: 注:在本类中,protected与private是相同的,但protected可以被继承,而private却不行. ...
- 继承下public,protected,private访问权限
C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...
- 快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...
- C++ 类访问控制(public/protected/private)
第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...
随机推荐
- 毕向东JAVA基础25天教程目录
视频目录:day01-01-基本常识day01-02-Java的跨平台性day01-03-Java环境搭建(安装)day01-04-Java环境搭建(环境变量配置)day01-05-Java环境搭建( ...
- 时间复杂度---我又要想起初中数学老师的脸了xxxxx
时间复杂度: 常用的时间复杂度有:常数级,对数级,线性级 线性对数级 平方级,立方级别,多项式级别,指数级别,阶乘级别 这里我们主要探讨对数级,线性级,平方级,指数级---为什么不讨论其他的?别的我也 ...
- Maven简单介绍
Maven是基于项目对象模型,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建规则 ...
- 一起学HTML基础-CSS样式表-基本概念、分类、选择器
一.基本概念: CSS (Cascading Style Sheets)层叠样式表,是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...
- win7 系统无法复制粘贴解决方案
用远程桌面登陆服务器不能在本机和远程服务器之间粘贴文本了,即不能从本机复制文本粘贴到服务器,也不能从服务器复制文本粘贴到本机. 以下是解决方法之一,试了几次都很管用户:在服务器上打开任务管理器,查看进 ...
- GridView联表搜索,排序
kartik-v/yii2-grid 文档http://demos.krajee.com/grid 在win7下 composer require kartik-v/yii2-grid "@ ...
- Ubuntu下C/C++man手册安装方法及使用方法
C++在线文档: http://www.cplusplus.com/reference/ https://msdn.microsoft.com/zh-cn/library/aa187916.aspx ...
- 【caffe】基本数据结构blob
@tags: caffe blob blob是caffe中的基本数据结构,简单理解就是一个"4维数组".但是,这个4维数组有什么意义? BTW,TensorFlow这款google ...
- linux中nc详解
|是管道符号,表示左边的输出作为右边的输入. 1.TCP端口扫描 # nc -v -z -w2 127.0.0.1 1-100 Connection to 127.0.0.1 22 port [tcp ...
- Mono开发环境搭建(Windows)
一.下载 1.登录http://www.mono-project.com/下载 2.开发工具Xamarin Studio(好像是免费) http://www.monodevelop.com/downl ...