第45课 继承中的访问级别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第45课 继承中的访问级别相关的知识,希望对你有一定的参考价值。

1. C++中3种不同的继承方式

(1)public继承:父类成员在子类中保持原有访问级别

(2)private继承:父类成员在子类中变为私有成员

(3)protected继承:父类中的公有成员变为保护成员,其它成员保持不变。

 技术分享

  ①继承成员的访问属性 = Max{继承方式, 父类成员访问属性},Max表示最严格

  ②C++中的默认继承方式为private

【编程实验】继承的访问级别深度实践

#include <iostream>
using namespace std;

class Parent
{
protected:    //在子类中可以直接访问
    int m_a;
protected:
    int m_b;
public:
    int m_c;
    
    void set(int a, int b, int c)
    {
        m_a = a;
        m_b = b;
        m_c = c;
    }
};

//冒号:表示继承关系,public表示继承方式,Parent为父类
class Child_A : public Parent  //public继承
{
public:
    void print()
    {
        cout << "m_a = " << m_a << endl;
        cout << "m_b = " << m_b << endl;
        cout << "m_c = " << m_c << endl;
    }    
};

class Child_B : protected Parent //protected继承
{
public:
    void print()
    {
        cout << "m_a = " << m_a << endl;
        cout << "m_b = " << m_b << endl;
        cout << "m_c = " << m_c << endl;
    }    
};

class Child_C : private Parent //protected继承
{
public:
    void print()
    {
        cout << "m_a = " << m_a << endl;
        cout << "m_b = " << m_b << endl;
        cout << "m_c = " << m_c << endl;
    }    
};

int main()
{
    Child_A a;
    Child_B b;
    Child_C c;
    
    a.m_c = 100; //合法
    //b.m_c = 100; //Child_B,protected继承自parent,所以来自父类的公有成员m_c
                 //变成了protected属性,外界无法访问
    //c.m_c = 100; //Child_C,private继承自parent,所以来自父类的成员m_c
                 //变成了private属性,外界无法访问

    a.set(1, 1, 1); //合法
    //b.set(2, 2, 2); //继承方式为protected,来自父类的函数set无法被外界访问
    //c.set(3, 3, 3); //继承方式为private,来自父类的函数set无法被外界访问 
    
    a.print();
    b.print();
    c.print();
    
    return 0;
}

2. 遗憾的事实

(1)一般而言,C++工程项目中只使用public继承

(2)C++的派生语言(如D、C#、Java)只支持一种继承方式(public继承)

(3)protected和private继承带来的复杂性远大于实用性

3. 小结

(1)C++中支持3种不同的继承方式

(2)继承方式直接影响父类成员在子类中的访问属性

(3)一般而言,工程中只使用public的继承方式

(4)C++的派生语言中只支持public继承方式

以上是关于第45课 继承中的访问级别的主要内容,如果未能解决你的问题,请参考以下文章

第44课 继承中的访问级别

第四十四课继承中的访问级别

继承中的访问级别(三十七)

C++--继承的概念和意义继承中的访问级别不同的继承方式

20175305张天钰 《java程序设计》第四周课下测试总结

更改框架类/方法的访问级别