【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++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
33 1
【C++】继承
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
104 4
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
39 3
|
2月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
67 1
|
2月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
49 1
|
2月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
22 0
|
2月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
41 0
|
2月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
44 0
|
28天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2