1 三种继承方式
C++ 中支持三种继承方式:公有继承,私有继承,保护继承,C++ 中的默认访问属性为 private
公有继承(public)
- 基类的 public 和 protected 成员的访问属性在派生类中保持不变,但基类的 private 成员不可直接访问。
- 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。
- 通过派生类的对象只能访问基类的 public 成员。
保护继承(protected)
- 基类的 public 和 protected 成员都以 protected 身份出现在派生类中,但基类的 private 成员不可直接访问。
- 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。
- 通过派生类的对象不能直接访问基类中的任何成员
私有继承(private)
- 基类的 public 和 protected 成员都以 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 继承