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_INCLUDEDnamespace boost {//  Private copy constructor and copy assignment ensure classes derived from
//  class noncopyable cannot be copied.//  Contributed by Dave Abrahamsnamespace noncopyable_  // protection from unintended ADL
{class noncopyable{protected:noncopyable() {}~noncopyable() {}private:  // emphasize the following members are privatenoncopyable( 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!";}
};


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



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

c++ big three


三法则(英语:rule of threethe Law of The Big ThreeThe Big Three三法则三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类型有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类型内,亦即下列三个成员函数缺一不可。 [1]:

  • 析构函数(Destructor)
  • 复制构造函数(copy constructor)
  • 复制赋值运算符(copy assignment operator)

上述三个函数是特别的成员函数,假如程序员没有自行定义或是编写声明它们,那么编译器会自动地创建它们,并且会编译至应用程序内。相反地,假如程序员有定义上述三者其中一个函数,那么由编译器自动产生出来的上述三个函数是不会搭配到这个类型内。三法则(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 7using 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_VEREXIT_SUCCESS
#endif;
}


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)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习易错笔记

学习易错笔记 将行同步时序图和场同步时序图结合起来&#xff0c;就构成了VGA时序图。VGA只能识别模拟信号&#xff0c;而FPGA输出的图像信息为数字信号。数字图像信号转化为模拟图像信号有二种方法&#xff0c;其一&#xff0c;使用专业的转换芯片&#xff0c;如常用的转换芯…

798的猫和人

两个女孩在模仿画中动作。 一只不知从哪走来的猫。 这是行为艺术还是装置艺术&#xff1f;观众也可以参与。不过有些许的恐怖。 又是模仿。三只装着衣服的龙。 圣之空间画廊内外

qt开发环境 - 丑陋的串口助手

qt版本&#xff1a;5.9.1 win版本&#xff1a;10.1706 本助手改自qt自带exmple中的terminal&#xff0c;去掉console相关内容&#xff0c;加入button textbowser textedit&#xff0c;只改变了mainwindow 下面是代码 /****************************************************…

OOo-MySpell 一个C++的拼写语法检查开源项目

地址: http://code.google.com/a/apache-extras.org/p/ooo-myspell/ 这个软件被应用到了 Pspell, OpenOffice, AbiWord, 等等.

与狼共舞·美女与野兽

收了一张法国女钢琴家埃莱娜格瑞莫的影碟&#xff0c;名为《埃莱娜格瑞莫&#xff1a;与狼共舞》&#xff08;Helene Grimaud:LIVING WITH WOLVES&#xff09;。前年曾读过她的一个自传《野变奏》&#xff08;上海教育出版社出版&#xff09;&#xff0c;去年还买过她一本传记《…

HDMI显示器驱动设计与验证

HDMI显示器驱动设计与验证 HDMI组成 HMDI数据传输图 TMDS信号连接图 HDMI彩条显示实验整体框图

“不要尝试欺骗我一个吻”(奥·安达尔摄影展)

少作 NO.33 &#xff08;眼睛&#xff09;, 2009 昨天&#xff0c;在伊比利亚艺术中心看挪威艺术家奥利约翰安达尔&#xff08;Ole John Aandal&#xff09;的题为“少作 ——构建资本主义社会的灵魂”的摄影展览。这些图片大多影象模糊&#xff0c;有的还有马赛克&#xff0…

qt开发环境 - 简易二进制文件打开,串口自发自收

qt版本&#xff1a;5.9.1 win版本&#xff1a;10.1706 下载&#xff1a;https://download.csdn.net/download/zn2857/10194028 改自上篇文章的串口助手&#xff0c;加入linEdit显示文件路径&#xff0c;加入新pushButton加载文件&#xff0c; 文件加载后显示在串口发送窗口…

SystemParametersInfo (SPI_GETNONCLIENTMETRICS... 在VC 2008 里不能正常工作

在codeproject上面看见一个颜色选择控件CColourPopup, 地址是 http://www.codeproject.com/Articles/713/A-color-picker-button 这里控件看到很多人再用, 但是在这个函数里面有点小问题 void CColourPopup::Initialise() {//other code// Create the fontNONCLIENTMETRICS n…

TFT_LCD液晶屏驱动设计与验证

TFT_LCD液晶屏驱动设计与验证 注:在本实验工程中,输出信号中包含 HV 同步模式下需要的行、场同步信号(hsync、 vsync)和 DE 同步模式下的 tft_de 信号,各信号正确输出。读者若想要使用 HV 同步模式进行图像显示,可在代码中注释掉 tft_de 信号;若想要使用 DE 同步模式进行图…

成吉思汗的子孙:中国游牧蒙古人

6月28日下午。大河画廊。内蒙古摄影家阿音题为“成吉思汗的子孙&#xff1a;中国游牧蒙古人”的个展。阿音&#xff0c;1970年出生于内蒙古。现居住在锡林郭勒盟的东乌珠穆沁旗。1989自学摄影。曾在国内外举办过多次摄影展&#xff0c;获得过2007年美国国家地理杂志世界纪实摄影…

保护Eclipse RCP应用的商业Java编译器

近日Excelsior LLC发布了最新版的Excelsior JET&#xff08;此前InfoQ对其做过介绍&#xff09;——Excelsior JET 6.5。该版本增加的一个主要特性就是处理Eclipse RCP应用的能力。\u0026#xD;\n凭借Excelsior JET&#xff0c;开发者可以将Eclipse RCP应用预编译为本地代码并分发…

ucos ii 文件分析

1. 平台介绍 本文档为基于uCOSII操作系统做开发的人员描述了一些uCOSII操作系统的基本特征。 1.1 结构图 图 1 整体结构图 2. 基本特征 2.1 uCOSII基本特征 uCOSII操作系统目前支持如下的基本特征&#xff1a; 1. 提供抢占式任务调度服务 2. 提供任务间同步与通信服务…

PJ Naughter's Freeware Library

http://www.codeproject.com/Articles/519/PJ-Naughter-s-Freeware-Library

FIFO求和实验

FIFO求和实验 实验目标:使用 Matlab 生成一个*.txt 文件,文件中包含模拟求和的数据, PC 机通过串口 RS232 将数据传给 FPGA,使用双 fifo 实现三行数据的 FIFO 求和,通过串口 RS232将求和后的数据回传给 PC 机,并通过串口助手打印出求和数据。 实验要求: *.txt 文件包含…

《老北大讲义》及其背后的故事

原北大校长胡适 不久前读到陈平原先生的一篇文章《早期北大文学史讲义三种》&#xff0c;该文对上世纪初北京大学的文科教学尤其是讲义的风行&#xff0c;做了非常细致的披露和分析。他说&#xff1a;&#xff08;老师授课&#xff09;“很少采纳通用教材&#xff0c;而喜欢临时…

日语过级 JLPT简介

JLPT(Japanese Language Proficiency Test),“日本语能力测试”是为了适应世界各国学习日语人数日渐增加的趋势&#xff0c;日本国际交流基金及其财团法人日本国际教育协会于1984年建立了一套较为完整的考试评价体系--日本语能力测试&#xff0c;并于同年开始在有关国家和地区实…

jtag相关

http://www.cnblogs.com/TaigaCon/archive/2012/12/20/2826941.html JTAG(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议&#xff08;IEEE 1149.1兼容&#xff09;&#xff0c;主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议&#xff0c;如DSP、…

为中国游牧蒙古人造像

第一次见到阿音&#xff0c;近距离地观看他的摄影&#xff0c;让我有一种愧疚感。作为蒙古人&#xff0c;在北京生活了30多年&#xff0c;我与自己民族的根和那片正在消逝的草原故地越来越疏远了。曾有人问我对故乡的理解&#xff0c;我说&#xff1a;我的故乡不过是记忆&#…