主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 继承


上一章 下一章

面向对象编程中最重要的概念之一是继承。继承允许我们在另一个类的基础上定义一个类,这使得创建和维护应用程序变得更加容易。这也提供了一个重用代码功能和快速实现的机会。

在创建一个类时,程序员不必编写全新的数据成员和成员函数,而是可以指定新类应该继承现有类的成员。这个现有类被称为基类,而新类则被称为派生类。

继承实现了“is a”的关系。例如,哺乳动物“is a”动物,狗“is a”哺乳动物,因此狗也是动物。

基类与派生类

一个类可以从多个类派生,这意味着它可以继承来自多个基类的数据和函数。定义派生类时,我们使用类派生列表来指定基类。类派生列表命名一个或多个基类,并且形式如下:

class derived-class: access-specifier base-class

其中 access-specifier 是 public、protected 或 private 中的一个,而 base-class 是先前定义的一个类。如果没有使用 access-specifier,则默认为 private。

考虑以下的基类 Shape 和其派生类 Rectangle:

#include <iostream>

using namespace std;

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

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

int main(void) {
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // 打印对象的面积。
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

当以上代码被编译和执行时,它产生如下结果:

Total area: 35

访问控制与继承

派生类可以访问其基类的所有非私有成员。因此,基类中不应被派生类成员函数访问的成员应声明为私有。

我们可以总结不同访问类型的控制如下:

访问类型 同一类内 派生类 外部类
Public 是 是 是
Protected 是 是 否
Private 是 否 否

派生类继承所有基类方法,除了以下几种例外:

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数。

继承类型

当从基类派生一个类时,基类可以通过 public、protected 或 private 继承。继承类型由上面解释的 access-specifier 指定。

我们几乎不用 protected 或 private 继承,但 public 继承常用。使用不同类型的继承时,遵循以下规则:

  • 公共继承:当从公共基类派生一个类时,基类的公共成员变为派生类的公共成员,基类的受保护成员变为派生类的受保护成员。基类的私有成员不能直接从派生类访问,但可以通过调用基类的公共和受保护成员来访问。
  • 受保护继承:当从受保护基类派生时,基类的公共和受保护成员变为派生类的受保护成员。
  • 私有继承:当从私有基类派生时,基类的公共和受保护成员变为派生类的私有成员。

多重继承

C++ 类可以使用多重继承从多个类继承成员。多重继承是一种允许一个类从多个基类继承的特性,这意味着派生类可以有多个父类,并且可以从所有基类继承属性和行为。

扩展的语法如下:

class derived-class: access baseA, access baseB...

其中 access 是 public、protected 或 private 中的一个,并且每个基类都有一个 access,它们之间用逗号分隔。让我们尝试以下示例:

#include <iostream>

using namespace std;

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

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

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

int main(void) {
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // 打印对象的面积。
   cout << "Total area: " << Rect.getArea() << endl;

   // 打印总油漆费用
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

当以上代码被编译和执行时,它产生如下结果:

Total area: 35
Total paint cost: $2450
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图