代码讲解C++继承和派生

这里我就来详细讲解一下“代码讲解C++继承和派生”的完整攻略。

1. C++继承

C++中的继承是指从一个类中派生出另一个类,具体实现方式为在派生类的定义中使用“:”后面跟上基类的名称。

1.1 基类和派生类的定义

下面是一个基类的定义:

class Shape {
    public:
        virtual void draw() = 0;
        virtual double area() = 0;
}

这里定义了一个图形类Shape,其中包含两个纯虚函数,分别为draw和area。这两个函数在派生类中必须被实现。

下面是一个派生类的定义:

class Circle : public Shape {
    private:
        double radius;
    public:
        Circle(double r) : radius(r) {}
        void draw() override {
            cout << "Drawing circle ..." << endl;
        }
        double area() override {
            return 3.14 * radius * radius;
        }
}

这里定义了一个圆形类Circle,它从基类Shape中继承了两个纯虚函数draw和area,并且实现了它们。在派生类的定义中,使用“:”后面跟上基类的名称来继承基类。

1.2 继承类型和访问控制

在C++中,派生类可以选择不同的继承类型,包括public、private和protected。

对于public继承,基类中所有的public成员都会成为派生类中的public成员,所有的protected成员都会成为派生类中的protected成员,所有的private成员都不可见。

对于private继承,基类中所有的public和protected成员都变成了派生类的private成员,所有的private成员都不可见。

对于protected继承,基类中所有的public和protected成员都变成了派生类的protected成员,所有的private成员都不可见。

1.3 多重继承

C++还支持多重继承,即从多个基类中派生出一个派生类。多重继承的定义方式与单一继承类似,在派生类的定义中使用“:”后面跟上多个基类的名称,用逗号隔开。

下面是一个多重继承的示例:

class BaseOne {
    public:
        void methodOne() {
            cout << "BaseOne::methodOne()" << endl;
        }
};

class BaseTwo {
    public:
        void methodTwo() {
            cout << "BaseTwo::methodTwo()" << endl;
        }
};

class Derived : public BaseOne, public BaseTwo {
    public:
        void method() {
            methodOne();
            methodTwo();
        }
};

这里定义了两个基类BaseOne和BaseTwo,以及一个派生类Derived,派生类从这两个基类中继承了它们的所有公共成员函数。在定义派生类Derived时,使用多个基类的名称,用逗号隔开。

2. C++派生

在C++中,从已有的类中派生出新的类称为派生。派生可以实现代码的复用,提高代码的可读性。

2.1 派生的方式

C++中有三种派生方式,分别为public、protected和private。不同的派生方式对派生类中的成员的访问权限不同。

对于public派生,原来基类中的public成员在派生类中仍然是public成员,原来基类中的protected成员在派生类中变成了protected成员,原来基类中的private成员在派生类中仍然是不可见的。

对于protected派生,原来基类中的public和protected成员在派生类中变成了protected成员,原来基类中的private成员在派生类中仍然是不可见的。

对于private派生,原来基类中的public和protected成员在派生类中变成了private成员,原来基类中的private成员在派生类中仍然是不可见的。

2.2 派生的实现

派生是通过派生类的定义来实现的,派生类的定义需要指明要从哪个基类派生出来,同时还可以在派生类中添加新的成员变量和成员函数。

下面是一个派生类的示例:

class Base {
    public:
        int num;
};

class Derived : public Base {
    public:
        int num2;
        void print() {
            cout << num << " " << num2 << endl;
        }
};

这里定义了一个基类Base和一个派生类Derived。在Derived类的定义中,使用“:”后面跟上public和基类名称Base,表示从Base类中public继承。Derived类还添加了一个新成员变量num2和一个成员函数print。

2.3 虚继承

虚继承和普通继承的区别在于,在继承链中存在共同的基类时,虚继承可以避免产生冗余的成员变量和函数,从而节省内存。

在C++中,使用关键字virtual来进行虚继承。

下面是一个虚继承的示例:

class Base {
    public:
        int num;
};

class Derived : virtual public Base {
    public:
        int num2;
};

class Derived2 : virtual public Base {
    public:
        int num3;
};

class Derived3 : public Derived, public Derived2 {
    public:
        void print() {
            cout << num << " " << num2 << " " << num3 << endl;
        }
};

这里定义了 Base、Derived、Derived2 和 Derived3 四个类。其中,Base是一个基类,Derived 和 Derived2 都是虚继承 Base,而 Derived3 则同时继承了 Derived 和 Derived2。

虚继承通常用于解决菱形继承问题,即某个类同时从两个派生类中继承相同的成员变量和函数。虚继承会让这个类只继承其中一个派生类的成员,从而避免了冗余的成员继承。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:代码讲解C++继承和派生 - Python技术站

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

相关文章

  • c#添加Newtonsoft.Json包的操作

    下面是详细的“c#添加Newtonsoft.Json包”的完整攻略。 步骤一:创建一个C#项目 首先,我们需要创建一个C#项目,这个项目可以是任何类型的,比如控制台应用程序、WPF应用程序、Web应用程序等。 步骤二:添加Newtonsoft.Json包 接下来,我们需要使用NuGet工具在C#项目中添加Newtonsoft.Json包。NuGet是一个用于…

    C 2023年5月23日
    00
  • c语言处理函数调用的方法

    C语言中处理函数调用的方法是程序设计中非常基础和重要的知识。以下是处理函数调用的方法的完整攻略,包括两个示例: 函数调用方法 在C语言中,函数通常被定义在程序的顶部,并在需要的时候被调用。函数调用是通过函数名、左括号、函数参数、右括号来完成的。下面是函数调用的基本语法: function_name(arguments); 在上面的语法中,function_n…

    C 2023年5月23日
    00
  • Qt学习之容器类的使用教程详解

    Qt学习之容器类的使用教程详解 介绍 Qt框架提供了许多容器类来帮助开发者高效地管理数据集合。这些容器类提供了各种重载的方法和运算符来满足不同的需求。 本文将详细介绍Qt提供的常用容器类的使用方法和注意事项。 QVector 概述 QVector是Qt提供的动态数组容器类,可以在运行时根据需要自动扩展容量,并且可以方便地访问和修改其中的元素。 常用方法 QV…

    C 2023年5月23日
    00
  • VS2019连接MySQL数据库的过程及常见问题总结

    VS2019连接MySQL数据库的过程及常见问题总结 1. 下载MySQLConnector/C++ 在Visual Studio 2019中使用MySQL数据库,我们需要先安装MySQLConnector/C++库。我们可以在MySQL官网上下载MySQLConnector/C++。下载地址如下:https://dev.mysql.com/download…

    C 2023年5月23日
    00
  • C#实现的ACCESS数据库操作类完整实例

    下面我将详细讲解“C#实现的ACCESS数据库操作类完整实例”的完整攻略。 1. 准备工作 在使用C#操作ACCESS数据库之前,需要做以下准备工作: 安装ACCESS数据库驱动程序 在C#项目中添加对ACCESS数据库的引用 在代码中引入对System.Data.OleDb命名空间的引用 2. 创建ACCESS数据库连接对象 在开始对ACCESS数据库进行…

    C 2023年5月22日
    00
  • C++ 基于BFS算法的走迷宫自动寻路的实现

    C++ 基于BFS算法的走迷宫自动寻路的实现攻略 算法介绍 BFS即广度优先搜索,它的主要思想是从起点出发,依次访问离起点最近的所有未访问的节点。它除了可以用于寻路,也可以用于其他需要搜索的问题中。在Maze寻路问题中,把所有可能走的路线一个个枚举出来,找到最短的一条。 实现步骤 1. 定义节点 定义一个节点,它包含迷宫的当前位置,当前步数,以及该位置的前一…

    C 2023年5月22日
    00
  • 查找算法之二分查找的C++实现

    查找算法之二分查找的C++实现 什么是二分查找? 二分查找(Binary Search),也叫折半查找,是一种在有序数组中查找某一特定元素的查找算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为…

    C 2023年5月22日
    00
  • C语言实现高精度加减法

    C语言实现高精度加减法 简介 高精度计算是指多位数的加、减、乘、除等算法。在计算机程序设计中,常常需要进行高精度计算。C语言是一种强大的编程语言,可以通过C语言实现高精度的加、减法运算。 实现思路 1. 字符串存储 高精度计算需要用到大量的数字,超过了C语言中能够表示的整型、浮点型数据类型范围,因此可以采用字符串存储数字。 2. 进位处理 在高精度计算中,进…

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