C++继承详细介绍

C++继承详细介绍

C++继承是非常重要的面向对象编程(OOP)概念之一,它允许派生类(子类)继承基类(父类)的特性。通过继承,子类能够重复利用基类的属性和方法,并且可以根据需要添加新的属性和方法。接下来我们将详细介绍C++继承的概念及其相关特性。

基本语法

class BaseClass {
  // 访问说明符
  public:
    int basePublicVar;
  protected:
    int baseProtectedVar;
  private:
    int basePrivateVar;
};

class DerivedClass : accessSpecifier BaseClass {
  // 访问说明符
  public:
    int derivedPublicVar;
  protected:
    int derivedProtectedVar;
  private:
    int derivedPrivateVar;
};

以上是定义派生类的基本语法。在继承中会使用到访问说明符(access specifier)public、protected、private,它们分别用来描述从基类中继承下来的成员函数或成员变量的访问权限,其用法与基类中的使用相同。派生类可以访问其从基类继承而来的公有成员,并使用这些成员,而其保护成员和私有成员则不可访问。

继承类型

公有继承

公有(public)继承是派生类可以访问基类公有成员的一种继承类型。公有继承是最常用的继承类型之一,它在实现“是一个(is-a)”关系时非常有用。

// 定义基类Shape
class Shape {
  public:
    int getArea() {
      return 0;
    }
};

// 定义派生类Rectangle
class Rectangle: public Shape {
  public:
    int width;
    int height;
    int getArea() {
      return (width * height);
    }
};

int main() {
  Rectangle Rect;
  Rect.width = 5;
  Rect.height = 7;
  int area = Rect.getArea();
  cout << "Total area: " << area << endl;
  return 0;
}

上述代码中,Rectangle类通过公有继承来继承Shape类中的getArea()函数,同时也可以定义自身新的成员。

保护继承

保护(protected)继承是一种继承方式,基类中的所有公共成员和保护成员都在派生类中变成了protected,派生类中新增成员的访问权限同样是protected。

class Shape {
  protected:
    int width;
    int height;
  public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
};

class Rectangle: protected Shape {
  public:
    int getArea() {
        return (width * height);
    }
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
};

int main() {
  Rectangle Rect;
  Rect.setWidth(5);
  Rect.setHeight(7);
  int area = Rect.getArea();
  cout << "Total area: " << area << endl;
  return 0;
}

私有继承

私有(private)继承是一种继承方式,基类中所有公共成员和保护成员都在派生类中变成了私有成员,私有成员只能在派生类的内部访问,不能从派生类外部进行访问。

class Shape {
  private:
    int width;
    int height;
  public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
};

class Rectangle: private Shape {
  public:
    int getArea() {
        return (width * height);
    }
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
};

int main() {
  Rectangle Rect;
  Rect.setWidth(5);
  Rect.setHeight(7);
  int area = Rect.getArea(); // 将报错
  cout << "Total area: " << area << endl;
  return 0;
}

多重继承

多重继承(multiple Inheritance)指一个类可以同时从多个基类那里继承信息,是C++面向对象编程的一个重要特性。多重继承的基本语法如下:

class Derived_Class: accessSpecifier Base_Class1, accessSpecifier Base_Class2 {
  // 类成员
};

其中Base_Class1和Base_Class2是两个基类,Derived_Class是一个派生类,accessSpecifier用于定义派生类成员访问的属性。同时使用逗号分隔两个基类。

以下是一个多重继承示例:

class Shape {
  public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
  protected:
    int width;
    int height;
};

class PaintCost {
  public:
    int getCost(int area) {
        return area * 70;
    }
};

class Rectangle: public Shape, public PaintCost {
  public:
    int getArea() {
        return (width * height);
    }
};

int main() {
  Rectangle Rect;
  Rect.setWidth(5);
  Rect.setHeight(7);
  int area = Rect.getArea();
  cout << "Total area: " << area << endl;
  cout << "Total paint cost: $" << Rect.getCost(area) << endl;
  return 0;
}

虚拟继承

虚拟继承(Virtual Inheritance)是多重继承的一种特殊方式,虚拟继承解决了多继承中出现的“菱形继承”问题,所引起的“二义性”的问题。

以下是一个虚拟继承的示例:

#include <iostream>
using namespace std;

class Animal {
 public:
  void speak() {
    cout << "Animal speaks" << endl;
  }
};

class Mammal: virtual public Animal { };

class WingedAnimal: virtual public Animal { };

class Bat: public Mammal, public WingedAnimal { };

int main() {
  Bat b1;
  b1.speak();
  return 0;
}

总结

C++中的继承是一个非常重要的面向对象编程概念,通过继承可以使子类重复利用基类的代码,从而减少代码的重复。在继承时需要注意访问权限以及多重继承可能引起的“菱形继承”问题。虚拟继承通过虚拟继承解决了这个问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++继承详细介绍 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言和嵌入式C的区别

    C语言和嵌入式C的区别 C语言和嵌入式C虽然在语法上很相似,但是它们的使用场景和目标不同。 C语言 C语言是一种通用的高级编程语言,它广泛应用于计算机软件开发、操作系统、网络编程等领域。C语言在设计时的主要目的是为Unix操作系统提供高效的底层编程语言,与Unix操作系统紧密结合,在计算机领域已经有40多年的历史。 C语言不依赖于任何特定系统或机器,代码可以…

    C 2023年5月10日
    00
  • 解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐)

    解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐) 一、c_cpp_properties.json文件是什么? c_cpp_properties.json文件是VS Code的配置文件之一,它被用来配置C++的调试器和语言服务器等属性。它通常是一个JSON格式的文件,包含了调试器和语言服务器的路径、编译器的路…

    C 2023年5月23日
    00
  • C#统计C、C++及C#程序代码行数的方法

    C#统计C、C++及C#程序代码行数的方法 概述 本文将介绍如何使用C#编写程序来统计C、C++以及C#程序的代码行数,具体步骤如下: 选择要统计代码行数的目录 遍历目录下所有的源代码文件 逐行读取文件内容,并统计代码行数 依赖项 在开始编写程序前,需要将以下依赖项添加到项目中: using System.IO; // IO操作类 using System.…

    C 2023年5月23日
    00
  • C++初始化列表学习

    C++初始化列表学习 什么是初始化列表? 初始化列表是C++中初始化class或者struct中成员变量的一种机制。使用初始化列表可以避免一些初始化过程中的不必要的计算和对象复制。 为什么要使用初始化列表? 在C++中,每个class或者struct中的变量都有一个默认的构造函数,如果没有定义其他的构造函数,编译器会自动使该构造函数有效。在某些情况下,简单的…

    C 2023年5月24日
    00
  • C语言返回字面量的地址

    C语言中,返回字面量的地址并不是一个安全的做法,因为字面量是常量,在程序执行期间是不会改变的。所以当返回字面量地址时,可能会导致地址被修改,从而发生严重的错误。但是,在某些特殊情况下,返回字面量的地址是有实际使用价值的。本文将详细讲解“C语言返回字面量的地址”的完整使用攻略。 1. 直接返回字面量地址 在C语言中,如果要直接将字面量作为返回值,可以使用以下语…

    C 2023年5月9日
    00
  • 一般故障排除步骤与方法

    一般故障排除步骤与方法是指在出现问题时,根据既定的步骤和方法,对系统进行排查、诊断和修复。以下是一般故障排除步骤与方法的完整攻略: 1.确认问题 提供详细信息,例如发生时间、出现的错误提示信息、是否有日志记录等。 尝试重复问题并确定是否一致。 确定问题的严重程度和影响范围。 2.收集信息 查看系统文件(日志文件、配置文件等)以及系统状态(CPU、内存)。 确…

    C 2023年5月24日
    00
  • C语言实现的ls命令源码分享

    下面我来详细讲解一下“C语言实现的ls命令源码分享”的完整攻略。该攻略主要包含以下内容: 前置知识介绍 实现思路说明 代码实现详解 示例说明 1. 前置知识介绍 在学习该攻略之前,需要您掌握以下知识: Linux系统基本使用命令: cd:切换工作目录 ls:列出目录下的文件和目录 mkdir:创建目录 touch:创建空文件 rm:删除文件或目录 rmdir…

    C 2023年5月23日
    00
  • C语言实现ATM系统程序的完整代码

    下面是C语言实现ATM系统程序的完整代码攻略,包括以下步骤: 确定实现ATM系统所需的功能和操作,例如登录、查询余额、取款、存款、转账等。 设计ATM系统的数据结构,包括记录用户信息的结构体、记录ATM机状态的结构体等。在这个实现中,我们可以采用一个用户信息的数据结构体,包含账户名、账户密码和账户余额等信息。对于ATM机状态,我们可以使用一个状态枚举变量,例…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部