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月前
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
88 0
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
345 6
|
8月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
134 16
|
8月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
178 5
|
10月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
155 1
【C++】继承
|
11月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
130 1
|
11月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
122 1
|
11月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
96 0
|
11月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
134 0
|
11月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
111 0