C++继承的定义与注意事项

yizhihongxing

C++继承的定义

C++中的继承是指一个类可以从另一个类中继承属性和行为。被继承的类称为父类或基类,继承的类称为派生类或子类。

在C++中,使用冒号符号来进行继承,语法如下:

class 子类名 : 访问修饰符 基类
{
    //子类的其他内容
};

其中,访问修饰符可以是publicprotectedprivate,用来决定派生类继承来的基类成员的访问权限。

  • public表示公有继承,在派生类中继承来的成员可以被外部访问;
  • protected表示保护继承,在派生类中继承来的成员不能被外部访问,但可以被派生类和其他基类的成员函数访问;
  • private表示私有继承,在派生类中继承来的成员只能被派生类的成员函数访问。

继承的注意事项

  1. 构造函数和析构函数的继承

派生类不会继承基类的构造函数和析构函数,但是在创建和销毁派生类对象时,会先调用基类的构造函数和析构函数,再调用派生类的构造函数和析构函数。

  1. 基类成员的访问权限

在派生类中,继承来的基类成员的访问权限受到访问修饰符的控制。

  • 如果是公有继承,那么继承来的基类成员,无论是公有的、保护的还是私有的,都可以在派生类中被访问;
  • 如果是保护继承,那么继承来的公有成员会变成保护成员,在派生类中只能被该类及其子类访问,而私有成员不会被继承;
  • 如果是私有继承,那么继承来的基类成员都会变成派生类的私有成员,在派生类外部无法访问,只能在该类内部访问。

  • 派生类与基类成员同名

如果派生类中的成员与基类中的成员同名,那么在派生类中访问该成员时,会默认访问派生类中的成员,如果想要访问基类中的成员,则可以使用作用域解析运算符::

class Base
{
public:
    int num = 10;
};

class Derived : public Base
{
public:
    int num = 20;

    void show()
    {
        cout << "Derived num: " << num << endl; //输出20
        cout << "Base num: " << Base::num << endl; //输出10
    }
};

示例说明

示例一

下面这个示例展示了一个简单的好处说明。

#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;
}

在这个示例中,基类Shape有两个函数setWidth()setHeight()以及两个保护成员widthheight。派生类RectangleShape类中继承了宽度和高度,并且实现了一个新方法getArea(),用来计算矩形的面积。在main()方法中,我们创建了一个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:
      void setWidth(int w) {
         width = w;
      }

      void setHeight(int h) {
         height = h;
      }

      int getArea() {
         return (width * height);
      }
};

int main(void) {
   Rectangle Rect;

   Rect.setWidth(5);
   Rect.setHeight(7);

   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

在这个示例中,派生类Rectangle中的方法setWidth()setHeight()与基类Shape中的方法同名。当我们使用Rect.setWidth()时,会默认访问派生类中的setWidth()方法,因此宽度的值不会被传递给基类。为了解决这个问题,我们可以使用作用域解析运算符::访问基类中的setWidth()setHeight()方法,从而正确地设置宽度和高度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++继承的定义与注意事项 - Python技术站

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

相关文章

  • Rust使用kind进行异常处理(错误的分类与传递)

    当我们编写代码时,难免会遇到程序中出现错误的情况,比如文件读写失败,网络连接超时等等。Rust中提供了一种异常处理机制,称之为“错误处理(Error Handling)”。在Rust中,我们可以使用kind进行错误分类和传递,下面将详细讲解如何使用kind进行异常处理。 1. 异常处理基础 Rust中,我们通常使用Result类型来进行异常处理。Result…

    C 2023年5月23日
    00
  • C语言指针算术运算和结构体

    C语言指针算术运算和结构体 指针算术运算 指针算术运算是指对指针变量进行加、减等运算。指针运算只有针对的是拥有某种类型的指针时才是有意义的,而且仅有两个指针的差异才有实际意义。指针变量与整数值进行运算时,整数值被转换为指向相应元素的指针。 以下是一些指针算术运算的示例: 1. 指针的加法运算 #include <stdio.h> int main…

    C 2023年5月10日
    00
  • 用函数模板,写一个简单高效的 JSON 查询器的方法介绍

    使用函数模板来写一个简单高效的 JSON 查询器,需要以下步骤: 1. 定义 JSON 数据结构 首先需要定义一个JSON数据结构,以便对其进行查询。这里我们将使用一个基于std::map的存储结构来表示JSON对象。其中,每个JSON对象的键值对都将被存储为std::map中的一对键-值。对于嵌套的JSON对象,我们可以将其表示为std::map的嵌套结构…

    C 2023年5月23日
    00
  • Golang加密解密之RSA(附带php)

    Golang加密解密之RSA RSA是非对称加密中常用的算法。首先要了解非对称加密和对称加密的区别: 对称加密:加解密使用同一把密钥 非对称加密:加解密使用一对公私钥 非对称加密最常见的方式就是RSA,接下来我们就主要介绍RSA的加密解密过程。 生成RSA公私钥对 Golang Golang中使用crypto库来生成RSA公私钥对。下面是生成2048位RSA…

    C 2023年5月22日
    00
  • Java编程基础测试题分享

    Java编程基础测试题分享攻略 背景说明 Java编程入门的学习是需要实践的。而测试题是测试自己知识掌握情况的重要方式之一。本文将介绍如何准备Java编程基础测试题,以及如何完整的解答测试题,帮助初学者更好地进行自我学习和检验。 准备测试题 找到适当的测试题,可以在网上搜索一些Java编程基础测试题,或者向周围有经验者拿一些推荐的Java编程基础测试题 将测…

    C 2023年5月23日
    00
  • golang中json和struct的使用说明

    当我们进行Web开发时,经常需要将数据发送和接收作为JSON格式,此时就需要掌握golang中json和struct的使用。 1. struct和json的概述 在golang中,我们可以使用struct表示一个自定义的数据类型。当我们需要发送和接收网络请求的时候,我们需要将一个struct对象序列化为JSON字符串,并且在收到响应后将JSON字符串反序列化…

    C 2023年5月23日
    00
  • C++ qt 使用jsoncpp json 读写操作

    下面是关于C++ Qt使用jsoncpp进行json读写操作的完整攻略。 步骤一:安装jsoncpp库 作为我们使用jsoncpp的前提,需要先安装jsoncpp库。可以通过如下命令进行安装: sudo apt-get update sudo apt-get install libjsoncpp-dev 步骤二:头文件及命名空间声明 在使用jsoncpp时,…

    C 2023年5月23日
    00
  • PostgreSQL 实现将多行合并转为列

    下面是详细讲解”PostgreSQL 实现将多行合并转为列”的完整攻略。 背景 假设当前有如下一张表格table1,其中id列为主键,col_name列为需要转为列的字段名称,col_value列为需要转为列字段对应的值。 id col_name col_value 1 name John 1 age 30 1 gender Male 2 name Emil…

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