【C++之多层继承】成员在各类的范围内的访问属性

简介: 【C++之多层继承】成员在各类的范围内的访问属性

题目要求


有以下程序结构,请分析所有成员在各类的范围内的访问属性。


#include <iostream>
using namespace std;
class A
{public:
  void f1( );
 protected:
  void f2();
 private:
  int i;
};
class B: public A
{public:
  void f3( );
  int k;
 private:
  int m;
};
class C: protected B
{public:
  void f4();
 protected:
  int n;
 private:
  int p;
};
class D: private C
{public:
  void f5();
 protected:
  int q;
 private:
  int r;
};
int main()
{A a1;
 B b1;
 C c1;
 D d1;
 return 0;
}


——谭浩强的《C++面向对象程序设计》第5章习题第6小题


分析


在基类的访问属性

继承方式

在派生类的访问属性

private

public

不可访问

private

private

不可访问

private

protected

不可访问

public

public

public

public

private

private

public

protected

protected

protected

public

protected

protected

private

private

protected

protected

protected


根据成员在基类的访问属性和继承方式,可以得到成员在派生类的访问属性。


成员

在A类的属性

在B类的属性

在C类的属性

在D类的属性

f1

public

public

protected

pricate

f2

protected

protected

protected

private

i

private

不可访问

不可访问

不可访问

f3

-

public

protected

private

k

-

public

protected

private

m

-

private

不可访问

不可访问

f4

-

-

public

private

n

-

-

protected

private

p

-

-

private

不可访问

f5

-

-

-

public

q

-

-

-

protected

r

-

-

-

private


上机验证


// https://blog.csdn.net/weixin_43470383/article/details/110492612
#include <iostream>
using namespace std;
class A
{
public:
  void f1(); // 在B、C和D类中都可以访问
protected:
  void f2(); // 在B、C和D类中都可以访问
private:
  int i;     // 在B、C和D类中都不可以访问
};
class B : public A
{
public:
  void f3() 
  {
  f1(); // 可以访问公用基类的公用成员函数
  f2(); // 可以访问公用基类的保护成员函数
  // i = 5; // 不可访问公用基类的私有成员
  };
  int k; // 在C和D类中都可以访问
private:
  int m; // 在C和D类中都不可以访问
};
class C : protected B
{
public:
  void f4()
  {
  f1(); // 可以访问保护基类的公用成员函数
  f2(); // 可以访问保护基类的保护成员函数
  f3(); // 可以访问保护基类的公用成员函数
  // i = 5; // 不可访问
  k = 5; // 可以访问保护基类的公用成员
  // m = 5; // 不可访问保护基类的私有成员
  }
protected:
  int n; // 在D类中可以访问
private:
  int p; // 在D类中不可以访问
};
class D : private C
{
public:
  void f5()
  {
  f1(); // 可以访问私有基类的公用成员函数
  f2(); // 可以访问私有基类的保护成员函数
  f3(); // 可以访问私有基类的公用成员函数
  f4(); // 可以访问私有基类的公用成员函数
  // i = 5; // 不可访问
  k = 5; // 可以访问私有基类的公用成员
  // m = 5; // 不可访问
  n = 5; // 可以访问私有基类的保护成员
  // p = 5; // 不可访问私有基类的私有成员
  }
protected:
  int q;
private:
  int r;
};
int main()
{
  A a1;        
  B b1;
  C c1;
  D d1;
  return 0;
}
相关文章
|
8月前
|
安全 Java 编译器
C++进阶(1)——继承
本文系统讲解C++继承机制,涵盖继承定义、访问限定符、派生类默认成员函数、菱形虚拟继承原理及组合与继承对比,深入剖析其在代码复用与面向对象设计中的应用。
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
347 0
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
263 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
975 6
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
253 16
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
429 1
【C++】继承
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
514 5
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
444 5
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
553 12