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 2023年5月9日
    00
  • 看面子选LCD —液晶面板A、B、C

    看面子选LCD —液晶面板A、B、C 在选择液晶面板时,除了考虑像尺寸和价格等常规因素,还需要谨慎评估其面板类型。面板的类型可以在宣传材料或数据表中找到。在液晶面板市场上,面板类型通常被标记为A、B或C类别,而且这些类别不仅影响面板的品质,而且会影响面板的价格。下面是一个详细的攻略来帮助你在A、B、C类别之间作出决策。 A、B、C 类面板的差异 三种类型面板…

    C 2023年5月22日
    00
  • Linux多线程环境下 关于进程线程终止函数总结

    让我来为您分享一下“Linux多线程环境下 关于进程线程终止函数总结”的完整攻略。 标题 一、背景 对于在Linux系统下进行多线程编程的开发人员来说,进程线程的创建、终止函数是必须要掌握的知识点。本文主要总结了Linux中进程线程终止的相关函数,如何使用它们,并提供了两个示例说明,帮助读者更好的理解这些函数的使用方法。 二、进程线程终止函数总结 下面是Li…

    C 2023年5月22日
    00
  • C#语言主要特性总结

    C#语言主要特性总结 C#是由微软开发的一种面向对象编程语言,拥有以下主要特性: 1. 强类型语言 C#是一种强类型语言,它要求变量在使用前必须定义类型。这意味着,对于一个变量,编译器需要确切地知道变量的类型,才能确定它占用多少内存空间。 以下是C#中的强类型定义示例: int num = 42; //定义一个int类型的变量 string name = &…

    C 2023年5月22日
    00
  • C++ 中的Lambda表达式写法

    当我们需要在C++中写一些短的、临时的函数时,常常使用Lambda表达式。Lambda表达式可以看作是一个匿名函数,它可以在任意处声明和定义,并且不会产生额外的开销。本文将详细讲解如何在C++中使用Lambda表达式。 基本语法 Lambda表达式的语法如下: [capture clause] (parameters) -> return_type {…

    C 2023年5月22日
    00
  • 知识蒸馏联邦学习的个性化技术综述

    知识蒸馏联邦学习的个性化技术综述 本篇文章主要介绍了知识蒸馏联邦学习的个性化技术。首先,对知识蒸馏技术和联邦学习技术进行了简要的介绍,然后通过分析后不同的组合方式,提出了三种个性化联邦学习方法,分别是FEDKD、FEMKD和FedMD等。 知识蒸馏技术 知识蒸馏技术是一种将一个深度神经网络的知识传递到另一个网络上的方法。也就是说,利用一个较大而准确的模型来对…

    C 2023年5月23日
    00
  • C++ Qt利用GPU加速计算的示例详解

    标题:C++ Qt利用GPU加速计算的示例详解 简介 本文将介绍使用C++和Qt框架实现使用GPU加速计算的方法。我们将介绍以下内容: 如何正确配置开发环境。 如何利用CUDA实现GPU加速。 如何使用Qt界面实现数据输入和结果展示。 开发环境配置 在开始之前,我们需要正确配置开发环境。首先,我们需要安装NVIDIA的GPU驱动和CUDA工具包。 驱动安装:…

    C 2023年5月23日
    00
  • python实现K最近邻算法

    下面我将为您详细讲解如何使用Python实现K最近邻算法的完整攻略。 K最近邻算法简介 K最近邻算法(K-Nearest Neighbor,简称KNN算法)是一种基于样本特征向量空间中距离度量来分类的方法。该算法的基本思路是,对于一个新的样本实例,在特征向量空间中寻找与其距离最近的K个已知类别的样本实例,然后根据这K个最邻近样本的类别,使用少数服从多数的投票…

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