C++ 权限控制,权限的继承(上)

简介: C++ 权限控制,权限的继承

在前两章节中,我们学习了类的创建,封装,继承,构造函数和析构函数,其中很多都提到了权限,由于我们是从C语言过渡过来的,所以当时没有过多讲解,这一章节我们来讲解一下权限的控制和权限的继承。


一.类的创建规范

之前章节在创建类的时候,我们通常将构造函数定义在类成员中,由于这样可读性较差,所以我们需要将构造函数,析构函数的定义写在类中,将函数的实现定义在外部:

案例:

struct Base{
  int a;
  int b;
  Base();
  Base(int a,int b);
  !Base();
}; 
Base::Base(int a,int b){
  this->a = a;
  this->b = b;
}

**需要注意的是,在类外部写函数实现的时候,需要在前面加上类名和::,告诉编译器这是类中的函数,否则编译器不认识这到底是类中的函数还是你定义的新函数。

二.public和private

我们在上一章节链接: C++ 类,this指针中讲解过权限控制符的具体介绍,不了解的可以去看一下,由于protected不经常使用,所以我们这里只介绍public和private。

我们来看看这样一段程序:

#include <stdio.h>
struct Base{
public:
  int a;
  int b;
private:
  int c;
  int d;
}; 
void Test(){
  Base t;
  t.a=1;
  t.b=2;
  t.c=3;
  t.d=4;
}
int main(){
  Test();
  return 0;
}

在编译的时候,我们可以看到出错误了,具体内容为:cannot access private member declared in class 'Base'告诉我们不能访问Base类中的成员c和d。

那么这就很好地体现了C++中的权限控制:

1.对外提供的函数或变量,发布成public的,但是后续不能随意更改。

2.可能会变动的函数或者变量,定义为private,这样在使用的时候编译器会自动检测。

3.只有结构体内部的成员(构造函数,析构函数和变量)可以访问private成员。

4.public/private可以修饰函数,也可以修饰变量。

三.public成员真的不能访问吗

在上面的程序中我们明显看到是不能访问的,但是对于学习底层的我们来说,我们还是可以访问的,我们可以通过指针来访问:

比如说这段代码:

#include <stdio.h>
struct Base{
public:
  int a;
  int b;
  Base(int a,int b,int c,int d){
    this->a = a;
    this->b = b;
  }
private:
  int c;
  int d;
}; 
void Test(){
  Base t(1,2,3,4);
  int* p;
  p = (int*)&t;
  printf("%d\n",*p);
  printf("%d\n",*(p+1));
}
int main(){
  Test();
  return 0;
}

我们能看到函数输出窗口还是输出了a和b的值。所以说private的成员还是能访问的,但是我们要通过强制转化指针来访问。

相关文章
|
3月前
|
编译器 C++
【C++】详解C++的继承
【C++】详解C++的继承
|
3天前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。
|
28天前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。
|
3月前
|
Rust NoSQL API
c++开发redis module问题之如果在加载module时,该module没有执行权限,Redis会如何解决
c++开发redis module问题之如果在加载module时,该module没有执行权限,Redis会如何解决
|
2月前
|
安全 Java 编译器
|
3月前
|
存储 Java 程序员
【c++】继承深度解剖
【c++】继承深度解剖
29 1
|
3月前
|
存储 编译器 数据安全/隐私保护
|
3月前
|
Java C++ 运维
开发与运维函数问题之C++中有哪些继承方式如何解决
开发与运维函数问题之C++中有哪些继承方式如何解决
24 0
|
4月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
3月前
|
存储 编译器 C++
C++基础知识(六:继承)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。