【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;
}
相关文章
|
1月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
57 16
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
50 5
|
3月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
42 1
【C++】继承
|
3月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
156 5
|
3月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
247 4
|
4月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
73 1
|
4月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
64 1
|
4月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
34 0
|
4月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
57 0
|
4月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
61 0