不同的继承方式(三十八)

        我们之前在学习继承的时候,冒号(:)表示继承关系,Parent 表示被继承的类,而 public 的意义又是什么呢?我们知道,C++ 中的跟 public 对应的关键字还有 protected 和 private,那么是否可以将继承语句中的 public 换成 protected 或者 private 呢?如果可以的话,它们与 public 继承又有什么区别呢?

创新互联建站是一家集网站建设,清江浦企业网站建设,清江浦品牌网站建设,网站定制,清江浦网站建设报价,网络营销,网络优化,清江浦网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

        我们来尝试下

#include 
#include 

using namespace std;

class Parent
{
};

class Child_A : public Parent
{
};

class Child_B : protected Parent
{
};

class Child_C : private Parent
{
};

int main()
{
    
    return 0;
}

        我们来编译下,看看编译器是否能通过呢?

不同的继承方式(三十八)

        我们看到编译通过了,证明这样写编译器是支持的。也就说明了继承不止 public 这一种继承,那么在 C++ 中支持三种不同的继承方式:a> public 继承:父类成员在子类中保持原有访问级别;b> private 继承:父类成员在子类中变成私有成员;c> protected 继承:父类中的公有成员变为保护成员,其它成员保持不变。通过下面这张表我们更能清晰的认识

不同的继承方式(三十八)

        那么继承成员的访问属性 = MAX {继承方式,父类成员的访问属性}。在 C++ 中的默认继承方式为 private!!!

        下来我们通过一个示例代码看看继承与访问级别的深度实践

#include 
#include 

using namespace std;

class Parent
{
private:
    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;
    }
};

class Child_A : public Parent
{
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
{
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
{
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 = 10;
    b.m_c = 10;
    c.m_c = 10;

    a.set(1, 1, 1);
    b.set(2, 2, 2);
    c.set(3, 3, 3);
    
    a.print();
    b.print();
    c.print();
*/    
    return 0;
}

        我们定义的三个 Child 分别是 public、protected、private 继承的,看看编译会通过嘛?

不同的继承方式(三十八)

        我们看到编译出错了,因为在父类中它是私有成员,所以在子类对象中不能使用。我们将父类中的 private 属性改为 protected,看看子类继承还会出错嘛

不同的继承方式(三十八)

        编译通过了,我们再来将利用子类对象改变其父类的 public 成员变量改变的三行语句注释去掉,看看编译能通过嘛

不同的继承方式(三十八)

        我们看到编译又报错了,因为 Child_B 保护继承自 Parent, 所以所有的 public 成员全部变成了 protected 成员, 因此外界无法访问;Child_C 私有继承自 Parent, 所以所有的 成员全部变成了 private 成员, 因此外界无法访问。我们注释掉两句,再来将下面 3 句调用父类的 set 函数的实数去掉,编译看看不同的继承方式(三十八)

        编译结果跟之前的一样,那么我们注释掉,再来看看直接调用它们自己内部定义的函数 print 呢

不同的继承方式(三十八)

        我们看到编译正常通过。那么我们经过这么多的实验,也应该是明白了三种方式继承的用法了。不过在现代的 C++ 项目工程中,我们一般只使用 public 继承。同样,C++ 的派生语言也只支持一种继承方式(public 继承),因为 protected 和 private 继承带来的复杂性远大于实用性。

        通过对继承方式的学习,总结如下:1、C++ 中支持 3 中不同的继承方式;2、继承方式直接影响父类成员在子类中的访问属性;3、一般而言,在工程中只使用 public 的继承方式;4、C++ 的额派生语言中只支持 public 继承方式。

        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。


网页标题:不同的继承方式(三十八)
文章链接:http://csdahua.cn/article/jeeiec.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流