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 ...
随机推荐
- A+B
Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...
- 02python算法-二分法简介
老规矩: 什么是二分法: 其实是一个数学领域的词,但是在计算机领域也有广泛的使用. 为什么需要二分法? 当穷举算法性能让你崩溃时. 二分法怎么用呢? 让我们先玩一个游戏先,我心里想一个100以内的整数 ...
- html-css控制背景图全屏拉伸不重复显示
在HTML中,当我们设置背景图,只能采用是否重叠.居中.重叠方向这几个选项 CSS3中设置 body { background:#3d71b8 url(../back_main.png); backg ...
- c# 导入导出Excel
1.引用两个js Codaxy.Xlio.dllCodaxy.Xlio.XmlSerializers.dll 2.导出 public string EntityListToExcel(string p ...
- 快速提高 Xcode 编译速度的方法(转载自网上一个大神的方法)
1.,中的 Debug Information Format 的选项中选择 DWARF ,平时调试就是用整个选项,经过测试,速度确实有很大的提升,等发行版本的时候在调回 DWARF with dsYM ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
- 在Eclipse中如何关联spring-framework的文档和源代码
1.到官方网站去下载spring-framework的jar包 spring-framework jar包的下载地址是:http://repo.spring.io/release/org/spring ...
- 【BZOJ-4520】K远点对 KD-Tree + 堆
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 490 Solved: 237[Submit][Status ...
- 【uoj149】 NOIP2015—子串
http://uoj.ac/problem/149 (题目链接) 题意 给出两个字符串A.B,问从A中取出k个互不重叠的子串按顺序组成B的方案数. Solution 一看这种题目就是字符串dp,字符串 ...
- dedecms /member/uploads_edit.php SQL Injection Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms 5.3版本下的member/uploads_edit.p ...