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 ...
随机推荐
- ART、JIT、AOT、Dalvik之间的关系
原文地址: https://github.com/ZhaoKaiQiang/AndroidDifficultAnalysis/blob/master/10.ART%E3%80%81JIT%E3%80% ...
- 莫比乌斯函数筛法 & 莫比乌斯反演
模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...
- mxnet目录结构
普通目录 R-package, R语言API, 因为用的python, 所以对R暂时不感兴趣 amalgamation, 将整个mxnet库打包成一个文件, 以方便直接在客户端调用, 如Android ...
- 平行四边形面积 light 1305
double 不一定是与x y轴平平行 所以要正弦定理和余弦定理 似乎一定要printf输出 错了好几次 #include<iostream> #include<math.h> ...
- spoj705 后缀数组求不同子串的个数
http://www.spoj.com/problems/SUBST1/en/ 题目链接 SUBST1 - New Distinct Substrings no tags Given a stri ...
- Canvas是什么
Canvas 是通过 JavaScript 来绘制 2D 图形,是 HTML 5 中新增的元素. Canvas 有如下特点: 绘制的是位图,图像放大后会失真. 不支持事件处理器. 能够以 .png 或 ...
- Python 从零学起(纯基础) 笔记(一)
作者身份:初学Python,菜鸟 ================================================= 1. 主提示符和次提示符 >>> 主提示符 ...
- SQL select结果集和return的区别
IF EXISTS (SELECT 1 FRIN sys.objects where object_id=OBJECT_ID(N'[dbo].[testReturn_up]')AND type in ...
- 【BZOJ-2427】软件安装 Tarjan + 树形01背包
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status ...
- wrapper for lua
考虑使用已经有的dll,要写wrapper,使得在lua中能调用dll里的函数,嗯,参考<Programming in lua>,然后仿写luars232. 一.函数定义 先分析一个函数的 ...