提示信息

C++ 继承机制详解

邀月 已关注

C++ 的继承机制是面向对象编程的重要特性之一,它允许开发者创建一个基本类(基类)和一个或多个派生类(子类),这些子类可以继承基类的属性和方法,并能够根据需要进行扩展和重写。以下是 C++ 继承机制的详解:

1. 基本概念

  • 基类(Base Class): 定义了共享的一般属性和行为。例如,一个 Animal 类可以定义基本特性如年龄和重量。
  • 派生类(Derived Class): 从基类继承属性和行为,同时可以增加新的属性和行为或重写基类的方法。例如,一个 Dog 类可以从 Animal 类中继承,但可以增加 bark 行为。

2. 继承类型

C++ 支持三种形式的继承:

  1. Public 继承:

    • 派生类可以访问基类的公有成员(public)和保护成员(protected)。
    • 公众继承通常被认为是"是一个"(is-a)关系。
    1. class Base {
    2. public:
    3. int publicVar;
    4. protected:
    5. int protectedVar;
    6. private:
    7. int privateVar;
    8. };
    9. class Derived : public Base {
    10. void accessBase() {
    11. publicVar = 1; // 允许
    12. protectedVar = 2; // 允许
    13. // privateVar = 3; // 不允许
    14. }
    15. };
  2. Protected 继承:

    • 基类的公共和保护成员在派生类中变为保护成员。
    • 通常不用于建模"是一个"关系,而是有其他特定目的。
    1. class Derived : protected Base {
    2. void accessBase() {
    3. publicVar = 1; // 允许(但在此派生类中为 protected)
    4. protectedVar = 2; // 允许
    5. }
    6. };
  3. Private 继承:

    • 基类的公共和保护成员在派生类中变为私有成员。
    • 这通常用于实现"has-a"或"实现细节"关系(而非"是一个"关系)。
    1. class Derived : private Base {
    2. void accessBase() {
    3. publicVar = 1; // 允许(但在此派生类中为 private)
    4. protectedVar = 2; // 允许
    5. }
    6. };

3. 多重继承

C++ 支持一个类从多个基类继承,即多重继承。

  1. class Base1 {
  2. // ...
  3. };
  4. class Base2 {
  5. // ...
  6. };
  7. class Derived : public Base1, public Base2 {
  8. // ...
  9. };

多重继承的强大功能同时伴随着复杂性,比如可能导致二义性问题和菱形继承问题(可以用虚继承解决)。

4. 虚继承

虚继承用于解决多重继承导致的菱形问题。通过虚继承,保障最终派生类只继承一套基类的成员。

  1. class Base {
  2. // ...
  3. };
  4. class Derived1 : virtual public Base {
  5. // ...
  6. };
  7. class Derived2 : virtual public Base {
  8. // ...
  9. };
  10. class Final : public Derived1, public Derived2 {
  11. // ...
  12. };

5. 重写与重载

  • 重写(Overriding): 当派生类定义一个与基类签名相同的函数时,称为对基类方法的重写。需要将基类方法标记为 virtual

    1. class Base {
    2. public:
    3. virtual void show() { std::cout << "Base show"; }
    4. };
    5. class Derived : public Base {
    6. public:
    7. void show() override { std::cout << "Derived show"; } // 重写
    8. };
  • 重载(Overloading): 在同一作用域中,函数名相同,但参数列表不同的几个函数。

6. 访问控制和对象切片

使用指针和引用来调用派生类对象的基类部分,防止对象切片(即对象被截断到只保留基类部分)。

7. 构造函数和析构函数

  • 派生类构造函数会自动调用基类构造函数,通常是无参构造函数,或者需要在初始化列表中显式调用。
  • 析构函数需要定义为虚函数,以确保资源释放顺序正确。

理解 C++ 的继承机制对于设计灵活和可扩展的对象系统至关重要。结合使用继承、组合和接口可以创建复杂而高效的软件体系结构。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
邀月 关注 已关注

最近一次登录:2024-11-20 23:26:00   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图