深入理解c++中public,protected,及private用法。

派生类对基类成员的访问权限 说起派生类对基类成员的访问权限可分为两种类型:一,派生类成员对基类的访问权限。二,派生类对象对基类成员的访问权限 阅读详情

            学习c++有一段时间了,越来越感觉c及c++基础的重要性,以前一直对c++的private,public,protected及继承有一些疑惑,看过了前辈们的讲解,顿时茅塞顿开,可能有些书上讲解的很详细,但是不一定能让大家理解的清晰透彻,所以我想写一篇自己的理解,希望可以帮助一些新学习c++语言的朋友们。

           c++语言的几个特性是抽象,封装,继承,多态。这里我们主要研究一下封装和继承。

1.在无继承的情况下,类内部可以随意访问,即使是private,;类外部无法访问protected/private成员 .但是可以访问public成员。


#include<iostream>
#include<assert.h>
usingnamespacestd;
classA{
public:
  inta;
  A(){
    a1 = 1;
    a2 = 2;
    a3 = 3;
    a = 4;
  }
  voidfun(){
    cout << a << endl;   //正确
    cout << a1 << endl;  //正确
    cout << a2 << endl;  //正确,类内访问
    cout << a3 << endl;  //正确,类内访问
  }
public:
  inta1;
protected:
  inta2;
private:
  inta3;
};
int main(){
  A itema;
  itema.a = 10;   //正确
  itema.a1 = 20;   //正确
  itema.a2 = 30;   //错误,类外不能访问protected成员
  itema.a3 = 40;   //错误,类外不能访问private成员
  system("pause");
  return0;
}
          

         通过这个例子,大家可以看到本类中的成员函数是可以访问私有成员的,但在类外,本例子就是main()中,是不能访问私有和保护成员的。

2.        (先确定类继承方式,

        再确定继承后子类的新成员属性,

        最后确定子类内部/外部的访问权限:!!!此时即使是在子类的内部也不能访问父类的private

         )

1.若是public继承的话,父类的public/protected/private属性继承到子类时,均不会变化   新成员

              在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)

              在子类外部访问时,无法访问子类的新成员protected/private

                

#include<iostream>
#include<assert.h>
usingnamespacestd;
  
classA{
public:
  inta;
  A(){
    a1 = 1;
    a2 = 2;
    a3 = 3;
    a = 4;
  }
  voidfun(){
    cout << a << endl;   //正确
    cout << a1 << endl;  //正确
    cout << a2 << endl;  //正确
    cout << a3 << endl;  //正确
  }
public:
  inta1;
protected:
  inta2;
private:
  inta3;
};
classB :public A{
public:
  inta;
  B(inti){
    A();
    a = i;
  }
  voidfun(){
    cout << a << endl;      //正确,public成员
    cout << a1 << endl;      //正确,基类的public成员,在派生类中仍是public成员。
    cout << a2 << endl;      //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
    cout << a3 << endl;      //错误,基类的private成员不能被派生类访问。
  }
};
int main(){
  B b(10);
  cout << b.a << endl;
  cout << b.a1 << endl;  //正确
  cout << b.a2 << endl;  //错误,类外不能访问protected成员
  cout << b.a3 << endl;  //错误,类外不能访问private成员
  system("pause");
  return0;
}

2.若是protected继承的话,父类的public/protected/private属性继承到子类时,会变化为新成员(protected/protected/private)


              在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)

              在子类外部访问时,无法访问子类的新成员protected/private

#include<iostream>
#include<assert.h>
usingnamespacestd;
classA{
public:
  inta;
  A(){
    a1 = 1;
    a2 = 2;
    a3 = 3;
    a = 4;
  }
  voidfun(){
    cout << a << endl;   //正确
    cout << a1 << endl;  //正确
    cout << a2 << endl;  //正确
    cout << a3 << endl;  //正确
  }
public:
  inta1;
protected:
  inta2;
private:
  inta3;
};
classB :protectedA{
public:
  inta;
  B(inti){
    A();
    a = i;
  }
  voidfun(){
    cout << a << endl;      //正确,public成员。
    cout << a1 << endl;      //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
    cout << a2 << endl;      //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
    cout << a3 << endl;      //错误,基类的private成员不能被派生类访问。
  }
};
int main(){
  B b(10);
  cout << b.a << endl;      //正确。public成员
  cout << b.a1 << endl;     //错误,protected成员不能在类外访问。
  cout << b.a2 << endl;     //错误,protected成员不能在类外访问。
  cout << b.a3 << endl;     //错误,private成员不能在类外访问。
  system("pause");
  return0;
}

3.若是private继承的话,父类的public/protected/private属性继承到子类时,会变化为private/private/private;

              在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)

              在子类外部访问时,无法访问子类的新成员protected/private

#include<iostream>
#include<assert.h>
usingnamespacestd;
classA{
public:
  inta;
  A(){
    a1 = 1;
    a2 = 2;
    a3 = 3;
    a = 4;
  }
  voidfun(){
    cout << a << endl;   //正确
    cout << a1 << endl;  //正确
    cout << a2 << endl;  //正确
    cout << a3 << endl;  //正确
  }
public:
  inta1;
protected:
  inta2;
private:
  inta3;
};
classB :private A{
public:
  inta;
  B(inti){
    A();
    a = i;
  }
  voidfun(){
    cout << a << endl;      //正确,public成员。
    cout << a1 << endl;      //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
    cout << a2 << endl;      //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
    cout << a3 << endl;      //错误,基类的private成员不能被派生类访问。
  }
};
int main(){
  B b(10);
  cout << b.a << endl;      //正确。public成员
  cout << b.a1 << endl;     //错误,private成员不能在类外访问。
  cout << b.a2 << endl;     //错误, private成员不能在类外访问。
  cout << b.a3 << endl;     //错误,private成员不能在类外访问。
  system("pause");
  return0;
}

相信大家看了上面的例子会有更深的理解,大家可以自己动手编写一下上面的例子,会有意想不到的收获。

给大家总结几句话:

1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private

2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private

3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,下面几点都没有改变:

1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问

2.protected成员可以被派生类访问;

3.基类的private成员不能被派生类访问,但是基类的protected成员可以被派生类访问。


C++中的private, public, protected Private, Public, and Protected in C++ 阅读详情

相关推荐

C++类详解(publicprivateprotected

二、C++类的声明   类使用class关键字声明,声明方法如下: class 类名: { public://公有成员 int num; private:私有成员 int age; protected:保护成员 int sex; }; 三、类的属性publicprivateprotected 类的public成员可以被任意实体访问,你可以认为它就是c语言中的struct结构体,可以直接用a.x这种形式访问; 类的private成员不能直接

weixin_39270987的博客 2万+

C++:类的使用【浅入了解publicprotectedprivate

上章讲解怎么声明、定义类的函数以及调用方法,这章讲解具体实现化,浅入了解其构造本质、规则。 一、三种关键字(publicprotectedprivate)应用范围 1、public(公共成员属性),类的成员属性使用权限。 Father.h: #pragma once class Father { //公共的行为或者属性(变量) public: void work(); //实现功能,工作领域 int paly(); //实现功能,交际方式 int m_Money; /

VisiousDragon的博客 1648

C++使用技巧(五):C类publicprotectedprivate用法

一、用法说明 1.类的一个特征就是封装,publicprivate作用就是实现这一目的。所以: 用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。 2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以: protected成员可以被派生类对象访问,不能被用户代码(类外)访问。 二、理解与实践 先从类定义里理解public, 定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意

源代码杀手的博客 1万+

深入理解C++publicprotectedprivate用法

初学C++的朋友经常在类中看到publicprotectedprivate以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++publicprotectedprivate用法。相信对于大家深入掌握C++程序设计会有很大的帮助。 这里我们首先要明白下面几点。 1.类的一个特征就是封装,publicprivate作用就是实现这一目的。所以: 用

Armypopy的博客 5842

abstract类中不可以有private的成员_深入理解C++publicprotectedprivate用法

这篇文章主要介绍了C++publicprotectedprivate用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下初学C++的朋友经常在类中看到publicprotectedprivate以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++publicprotectedprivate用法。相信对于大家深入掌握C++程序设计会有...

weixin_39827506的博客 273

c语言private用法,深入理解C++publicprotectedprivate用法

初学C++的朋友经常在类中看到publicprotectedprivate以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++publicprotectedprivate用法。相信对于大家深入掌握C++程序设计会有很大的帮助。这里我们首先要明白下面几点。1.类的一个特征就是封装,publicprivate作用就是实现这一目的。所以:用户代码(类外)可以访问p...

weixin_39582724的博客 4732

c语言中public 用法,深入理解C++publicprotectedprivate用法

初学C++的朋友经常在类中看到publicprotectedprivate以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++publicprotectedprivate用法。相信对于大家深入掌握C++程序设计会有很大的帮助。这里我们首先要明白下面几点。1.类的一个特征就是封装,publicprivate作用就是实现这一目的。所以:用户代码(类外)可以访问p...

weixin_34840783的博客 9756
北方的雪pp
博客等级 码龄15年 2粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值