【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

上机验证

#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;
}

【腾讯云】新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。

#C/C++##c++#
C++学习 文章被收录于专栏

c++面向对象程序设计课, 作业题选自谭浩强的《c++面向对象程序设计》(第2版)

全部评论
C++之多层继承的范围
点赞 回复 分享
发布于 2022-08-28 13:45 河南

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务