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语言模拟实现memmove的示例代码

    下面我将帮助您详细讲解“C语言模拟实现memmove的示例代码”的完整攻略。 什么是memmove函数? memmove函数是C语言标准库中的字符串处理函数之一,用于将一块位于内存中的区域复制到另一块位于内存的区域中。memmove函数的声明如下: void *memmove(void *dest, const void *src, size_t n); 其…

    C 2023年5月23日
    00
  • 用C语言画一个圆

    下面是用C语言画圆的完整攻略。 1. 前置知识 在绘制圆形之前需要先掌握以下内容: C语言基础:掌握C语言的基本语法和操作,包括变量、运算符、分支结构、循环结构等。 数学知识:了解圆的相关数学知识,如圆的半径、直径、周长、面积等。 图形学基础:掌握画图基本原理,了解坐标系、像素、颜色等概念。同时需要了解常用的图形库,如Windows.h、OpenGL等。 2…

    C 2023年5月24日
    00
  • 详解_beginthreadex()创建线程

    当我们需要在程序中实现多线程并行操作时,可以使用C或C++中的beginthreadex函数来创建线程。该函数用于创建一个新线程并在其中运行指定的函数。下面是完整的攻略,包括使用示例。 一、语法 uintptr_t _beginthreadex( void* security, unsigned stack_size, unsigned(__stdcall*…

    C 2023年5月22日
    00
  • 详解如何使用VSCode和CMake构建跨平台的C/C++开发环境

    详解如何使用VSCode和CMake构建跨平台的C/C++开发环境 在本文中,我们将介绍如何使用VSCode和CMake构建跨平台的C/C++开发环境。CMake是一个跨平台的构建系统,可以在不同的操作系统和编译器下生成不同的构建配置,使得开发者可以方便地将代码移植到不同的平台上。而VSCode则是一个轻量级但功能强大的文本编辑器,集成了多种插件和功能,支持…

    C 2023年5月23日
    00
  • 深入理解Commonjs规范及Node模块实现

    深入理解 CommonJS 规范及 Node 模块实现 什么是 CommonJS 规范? CommonJS 是 JavaScript 社区为了解决缺少适用于服务器端的 Module 标准而提出的一种模块化规范。其最初的定位是为了规范模块文件、模块导入、模块导出等相关概念。CommonJS 规范将所有的代码都认为是一个模块,每个模块有自己的作用域,可以定义变量…

    C 2023年5月23日
    00
  • 酷派大神F1电信版怎么样?酷派大神F1电信版体验全面评测

    酷派大神F1电信版怎么样?酷派大神F1电信版体验全面评测 1. 硬件配置 酷派大神F1电信版搭载了高通骁龙8核处理器,并配备了3GB RAM和32GB ROM的存储空间,支持128GB的扩展存储。电池容量达到2900mAh,支持快速充电功能,可以快速满电。 2. 屏幕与外观 酷派大神F1电信版采用了一块5.5英寸1280×720分辨率的IPS屏幕,显示效果比…

    C 2023年5月22日
    00
  • win10系统左下角搜索栏点击Win+C无反应的解决方法

    当我们在Win10系统中使用搜索栏,偶尔会遇到点击Win+C无反应的问题。这可能是由于系统故障、Win10更新问题或安装软件不当等原因引起的。以下是解决这个问题的完整攻略,可以帮助您解决这个问题。 问题分析 当搜索栏出现在左下角时,在Windows 10操作系统上单击Win+C组合键时,应该会打开Cortana语音助手,但是有时候无论怎么按,都没有反应。这种…

    C 2023年5月23日
    00
  • 谈谈iOS开发之JSON格式数据的生成与解析

    iOS开发中的JSON数据 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在iOS开发中常用于前后端交互、接口请求等方面。在iOS开发中,我们可以使用系统提供的NSJSONSerialization类实现对JSON格式数据的生成和解析。 JSON数据的生成 我们可以使用Foundation框架中的NSJSONSe…

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