【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;
}
相关文章
|
9天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
16 0
|
9天前
|
安全 编译器 程序员
c++的学习之路:20、继承(1)
c++的学习之路:20、继承(1)
27 0
|
1天前
|
C++ 芯片
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
|
2天前
|
存储 Java C++
【C++类和对象】探索static成员、友元以及内部类
【C++类和对象】探索static成员、友元以及内部类
|
4天前
|
安全 Java 程序员
【C++笔记】从零开始认识继承
在编程中,继承是C++的核心特性,它允许类复用和扩展已有功能。继承自一个基类的派生类可以拥有基类的属性和方法,同时添加自己的特性。继承的起源是为了解决代码重复,提高模块化和可维护性。继承关系中的类形成层次结构,基类定义共性,派生类则根据需求添加特有功能。在继承时,需要注意成员函数的隐藏、作用域以及默认成员函数(的处理。此外,继承不支持友元关系的继承,静态成员在整个继承体系中是唯一的。虽然多继承和菱形继承可以提供复杂的设计,但它们可能导致二义性、数据冗余和性能问题,因此在实际编程中应谨慎使用。
5 1
【C++笔记】从零开始认识继承
|
6天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
18 1
|
8天前
|
编译器 C++
【C++进阶(八)】C++继承深度剖析
【C++进阶(八)】C++继承深度剖析
|
8天前
|
C++
C++ 访问说明符详解:封装数据,控制访问,提升安全性
C++ 中的访问说明符(public, private, protected)用于控制类成员的可访问性,实现封装,增强数据安全性。public 成员在任何地方都可访问,private 只能在类内部访问,protected 则允许在类及其派生类中访问。封装提供数据安全性、代码维护性和可重用性,通过 setter/getter 方法控制对私有数据的访问。关注公众号 `Let us Coding` 获取更多内容。
24 1
|
15天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
15天前
|
编译器 C语言 C++
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装