【C++深度解析】31、三种继承方式(public,protected,private)

1 三种继承方式

C++ 中支持三种继承方式:公有继承,私有继承,保护继承,C++ 中的默认访问属性为 private

公有继承(public)

  • 基类的 publicprotected 成员的访问属性在派生类中保持不变,但基类的 private 成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。
  • 通过派生类的对象只能访问基类的 public 成员。

保护继承(protected)

  • 基类的 publicprotected 成员都以 protected 身份出现在派生类中,但基类的 private 成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。
  • 通过派生类的对象不能直接访问基类中的任何成员

私有继承(private)

  • 基类的 publicprotected 成员都以 private 身份出现在派生类中,但基类的 private 成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。

在这里插入图片描述
继承成员的访问属性:

  • 父类中的 private 成员在子类中均不可直接访问
  • 其他成员 = Max{继承方式,父类成员访问属性}

编程实验:不同的继承方式

// 31-1.cpp
#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;
    }
};
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 = 100;
    a.set(1, 1, 1);
    
    a.print();
    b.print();
    c.print();
    return 0;
}
  • Child_A 为 public 继承,public 成员和 protected 成员在子类中属性不变
  • Child_B 为 protected 继承,public 成员和 protected 成员在子类中属性为 protected
  • Child_C 为 private 继承,public 成员和 protected 成员在子类中属性为 private
$ g++ 31-1.cpp -o 31-1
$ ./31-1
m_a = 1
m_b = 1
m_c = 1
m_a = 273976528
m_b = 21880
m_c = 273975408
m_a = 21880
m_b = -194008880
m_c = 32767

1.1 protected 和 private 继承的遗憾

虽然 C++ 提供了三种继承方式,但是,一般而言,工程中只使用 public 继承,protected 和 private 继承带来的复杂性大于实用性,而且 C++ 的派生语言只支持一种继承方式

2 小结

1、C++ 支持 3 种不同继承方式,继承方式直接影响父类在子类中的访问属性
2、工程种只使用 public 继承

发布了298 篇原创文章 · 获赞 181 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/104302512