类派生新类的继承语法
class Base {
// 基类成员
};
// public 继承
class Derived1 : public Base {
// 派生类成员
};
// private 继承
class Derived2 : private Base {
// 派生类成员
};
// protected 继承
class Derived3 : protected Base {
// 派生类成员
};
结构体派生新类的继承语法
struct Base {
// 基类成员
};
// public 继承,结构体默认是 public 继承
struct Derived4 : Base {
// 派生类成员
};
// private 继承
struct Derived5 : private Base {
// 派生类成员
};
// protected 继承
struct Derived6 : protected Base {
// 派生类成员
};
不同继承方式对派生类成员访问权限以及外部访问权限的影响
- public 继承:
- 派生类成员访问权限:基类的 public 成员在派生类中仍然是 public,protected 成员仍然是 protected,private 成员在派生类中不可访问。
- 外部访问权限:外部代码可以访问派生类对象中的 public 成员,无法访问 protected 和 private 成员。
- private 继承:
- 派生类成员访问权限:基类的 public 和 protected 成员在派生类中都变成 private,private 成员在派生类中不可访问。
- 外部访问权限:外部代码无法访问派生类对象中的任何从基类继承来的成员(因为都变成了 private)。
- protected 继承:
- 派生类成员访问权限:基类的 public 和 protected 成员在派生类中都变成 protected,private 成员在派生类中不可访问。
- 外部访问权限:外部代码无法访问派生类对象中的任何从基类继承来的成员(因为都变成了 protected 或原本就是 private)。
实际编程中如何根据需求选择合适的继承方式
- is - a 关系(public 继承):当派生类和基类满足 “is - a” 关系,即派生类是基类的一种特殊类型时,使用 public 继承。例如,“狗是动物”,狗类(派生类)可以 public 继承动物类(基类),这样狗类就自然拥有动物类的公共属性和行为,外部也可以合理地通过派生类对象访问从基类继承的 public 成员。
- 实现复用(private 继承):如果只是想复用基类的实现代码,而不想让派生类和基类之间有 “is - a” 的逻辑关系,可使用 private 继承。此时基类的接口在派生类中都变为 private,外部无法访问,派生类可以根据自身需求重新设计接口,以满足自身的特定需求。
- 内部复用与保护(protected 继承):当希望派生类及其派生类(如果有多层继承)能够复用基类的实现,但又不想让外部直接访问从基类继承的成员时,使用 protected 继承。这在实现一些框架或库时较为有用,允许框架内部的派生类复用基类的功能,但对外部隐藏这些细节。