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 ...
随机推荐
- android中通话录音
file = new File(Environment.getExternalStorageDirectory(), this.incomeNumber + System.currentTimeMil ...
- 超级详细的iptable教程文档
Iptabels是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能.如果 Linux 系统连接到因特网或 LAN.服务器或连接 LAN 和因特网的代理 ...
- 2010-2014总结 ____V_V____ hello-world
.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table ...
- java classloader
一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoader.App ClassLoader,分别各司其职: Bootstrap ...
- R 绘图 填充颜色
d <- density(mtcars$mpg) plot(d, main="Kernel Density of Miles Per Gallon") polygon(d, ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- UOJ149 【NOIP2015】子串
本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! [问题描述]有两个仅包含小写英文字母的字符串 A ...
- 未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序解决办法
错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序. 解决办法: 去http://download.microsoft.com/download/7/0/3/7 ...
- python面相对象进阶
1. 类的成员 python 类的成员有三种:字段.方法.属性 字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段 属于对象,只有对象创建 ...
- 基本概率分布Basic Concept of Probability Distributions 4: Negative Binomial Distribution
PDF version PMF Suppose there is a sequence of independent Bernoulli trials, each trial having two p ...