iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文带你学习C++中的派生机制
  • 717
分享到

一文带你学习C++中的派生机制

C++派生机制应用C++派生机制C++派生 2023-05-15 17:05:34 717人浏览 独家记忆
摘要

目录一、派生的类型二、派生的语法三、多重继承四、虚继承五、派生类和基类的关系六、总结c++是一门面向对象的编程语言,其中的派生机制是其重要的面向对象特性之一。派生是建立在现有类的基础

c++是一门面向对象编程语言,其中的派生机制是其重要的面向对象特性之一。派生是建立在现有类的基础之上,创建一个新的类的过程。在新类中,可以利用父类中定义的变量和方法,并且可以添加新的成员变量和方法。

下面我们来详细地学习C++中的派生机制。

一、派生的类型

C++支持以下几种派生类型:

1.公有派生: 在公有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。公有派生通常用于向基类添加新的特征和行为。

示例代码如下:

class Base {
public:
    int public_var;
protected:
    int protected_var;
private:
    int private_var;
};

class Derived : public Base {
public:
    void setVar(int a, int b, int c)
    {
        public_var = a;  //公有成员可以在派生类中访问
        protected_var = b;  //受保护成员可以在派生类中访问
        // private_var = c;  //私有成员无法在派生类中访问
    }
};

2.保护派生: 在保护派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。保护派生通常用于继承,即将基类的所有成员和方法都继承到派生类中。

示例代码如下:

class Base {
public:
    int public_var;
protected:
    int protected_var;
private:
    int private_var;
};

class Derived : protected Base {
public:
    void setVar(int a, int b, int c)
    {
        public_var = a;  //公有成员可以在派生类中访问
        protected_var = b;  //受保护成员可以在派生类中访问
        // private_var = c;  //私有成员无法在派生类中访问
    }
};

3.私有派生: 在私有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。私有派生通常用于“隐藏”继承,即对基类进行改进或扩展,但不公开基类的接口。

示例代码如下:

class Base {
public:
    int public_var;
protected:
    int protected_var;
private:
    int private_var;
};

class Derived : private Base {
public:
    void setVar(int a, int b, int c)
    {
        public_var = a;  //公有成员可以在派生类中访问
        protected_var = b;  //受保护成员可以在派生类中访问
        // private_var = c;  //私有成员无法在派生类中访问
    }
};

二、派生的语法

在C++中,派生的语法为:

class Derived_class : access_specifier Base_class {
    // 包含新成员和覆盖的函数等
};

其中,Derived_class 是基于 Base_class 的派生类。access_specifier 表示派生类型,可以是 public、protected 或 private。新的成员和覆盖的函数等是指在派生类中添加的成员和方法。

示例代码如下:

class Base {
public:
    void print() {
        std::cout << "Base" << std::endl;
    }
};

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

int main()
{
    Base b;
    Derived d;

    b.print(); //输出 Base
    d.print(); //输出 Derived

    return 0;
}

上述代码中,Base 类中定义了一个 print() 方法,输出 Base。Derived 类继承自 Base 类,并定义了一个同名的 print() 方法,输出 Derived。在 main 函数中,分别创建了 Base 类和 Derived 类的对象并分别调用了它们的 print() 方法。结果显示,派生类覆盖了其基类的同名方法。

三、多重继承

C++还支持多重继承,即一个派生类从多个基类派生而来。具体地,可以这样建立一个派生类:

class Derived : access_specifier Base1, access_specifier Base2, ... {
    // 包含新成员和覆盖的函数等
};

其中,Derived 是一个派生类,Base1、Base2 是两个基类,可以有多个基类。access_specifier 表示该基类在派生类中的访问权限,可以是 public、protected 或 private。

示例代码如下:

class Base1 {
public:
    void print1() {
        std::cout << "Base1" << std::endl;
    }
};

class Base2 {
public:
    void print2() {
        std::cout << "Base2" << std::endl;
    }
};

class Derived : public Base1, protected Base2 {
public:
    void print() {
        print1();
        //print2(); //private 成员不能在派生类之外的成员函数中访问
    }
};

int main()
{
    Derived d;
    d.print();

    return 0;
}

上述代码中,定义了两个基类 Base1 和 Base2,分别有各自的方法 print1() 和 print2()。派生类 Derived 继承自 Base1 和 Base2,由于 Base2 的访问权限设置为 protected,在 Derived 中,只有成员函数可以访问 Base2 中的成员。Derived 中定义的 print() 方法分别调用了 Base1 和 Base2 中的方法,结果显示,多重继承能够在派生类中同时使用多个基类的成员,并进行灵活的访问权限设置。

四、虚继承

当一个类同时从多个基类继承,而这些基类中又有共同的基类时,就会出现“二义性”的问题。为了解决这个问题,C++引入了虚继承机制。

虚继承使用关键字 virtual,它告诉编译器,在继承链中只保留一份共同的基类,从而避免了多次继承造成的冗余。另外,虚继承还规定了一个虚基类列表。虚基类列表中的类在继承链中只继承一次,并且会在最深层的派生类中进行初始化。

示例代码如下:

class Root {
public:
    int i;
};

class A : public virtual Root {
public:
    int j;
};

class B : public virtual Root {
public:
    int k;
};

class C : public A, public B {
public:
    void sum() {
        i = j + k;
    }
};

int main()
{
    C c;

    c.j = 10;
    c.k = 20;
    c.sum();

    std::cout << "Sum of j and k is " << c.i << std::endl;

    return 0;
}

上述代码中,定义了一个基类 Root,和两个继承了 Root 的派生类 A 和 B。类 C 同时从 A 和 B 继承,它将 A 和 B 中的 i 合并为一份,并且在最深层的派生类 C 中进行初始化。在 main 函数中,我们创建了类 C 的对象 c,并对它的成员变量 j 和 k 赋值,并通过 sum() 方法计算它们的和。

五、派生类和基类的关系

派生类和基类之间存在以下关系:

  • 派生类包含的成员都是派生类自己定义的,但它可以访问基类的公有成员和受保护成员,也可以使用基类中的方法。
  • 派生类的对象中包含了基类的对象,即派生类的对象中包含了基类对象的成员。
  • 派生类的对象可以被看作是基类的对象,即派生类的对象可以直接赋值给基类对象。

示例代码如下:

class Base {
public:
    int publicVar;
protected:
    int protectedVar;
private:
    int privateVar;
public:
    void print() {
        std::cout << "publicVar: " << publicVar << std::endl;
        std::cout << "protectedVar: " << protectedVar << std::endl;
        std::cout << "privateVar: " << privateVar << std::endl;
    }
};

class Derived : public Base {
public:
    int additionalVar;
public:
    void printAdditionalVar() {
        std::cout << "additionalVar: " << additionalVar << std::endl;
    }
};

int main()
{
    Derived derived;
    derived.publicVar = 1;
    //derived.protectedVar = 2;  //protected 成员不能直接在类外部访问
    derived.print();  //基类中的公有成员和受保护成员可以在派生类对象中访问
    derived.additionalVar = 3;
    derived.printAdditionalVar();  //派生类中的成员可以直接访问
    Base& base = derived;  //派生类的对象可以赋值给基类对象
    base.print();  //基类中的成员可以在基类对象中访问
    return 0;
}

上述代码中,定义了一个基类 Base 和一个派生类 Derived。在 main 函数中,我们首先创建了一个 Derived 的对象 derived,可以看到它可以访问由其基类 Base 中继承的成员变量和方法。同时,我们为 derived 对象中定义了一个 additionalVar 成员,并定义了一个打印 additionalVar 的方法。接着,我们将 derived 对象赋值给了一个 Base 类型的引用 base,并通过 base 访问了 Base 类中的成员变量和方法。结果显示了派生类和基类之间的关系。

六、总结

本文介绍了C++中的派生机制,包括公有派生、保护派生、私有派生、多重继承和虚继承等。同时,文章还介绍了派生类和基类之间的关系。理解并掌握派生机制,可以提高我们在C++编程中的应用技能。

到此这篇关于一文带你学习C++中的派生机制的文章就介绍到这了,更多相关C++派生机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你学习C++中的派生机制

本文链接: https://www.lsjlt.com/news/209333.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文带你学习C++中的派生机制
    目录一、派生的类型二、派生的语法三、多重继承四、虚继承五、派生类和基类的关系六、总结C++是一门面向对象的编程语言,其中的派生机制是其重要的面向对象特性之一。派生是建立在现有类的基础...
    99+
    2023-05-15
    C++派生机制应用 C++派生机制 C++派生
  • 一文带你学习C++中的虚函数
    目录概念语法使用总结概念 虚函数是一种具有特殊属性的成员函数,它可以被子类重写,并在运行时确定调用哪个方法。为了定义一个虚函数,将在该函数的声明中使用关键字virtual。当调用一个...
    99+
    2023-05-19
    C++虚函数 C++函数
  • 一文带你学习C/C++中的<Windows.h>库
    目录前言(1)cls(2)pause(3)(4)关机开机不必多说。(5)color XX总结前言 众所周知,C++里有一个语句system,那么他究竟有什么用呢?我们来看一看吧。 s...
    99+
    2023-01-11
    c++ windows.h库 C++ windows.h C语言Windows.h
  • 一文带你学习一下C++中的构造函数
    目录C++构造函数学习1.带参数的构造函数2.多个构造函数3.拷贝构造函数C++构造函数学习 构造函数是一种特殊的函数,它用于在创建对象时初始化对象的值。所有的类都有构造函数,但如果...
    99+
    2023-05-19
    C++构造函数的使用 C++构造函数学习 C++构造函数 C++ 函数
  • 一文带你学习C++析构函数
    目录C++析构函数的学习析构函数的基本使用多个析构函数的使用继承中的析构函数总结C++析构函数的学习 在C++中,析构函数是一种特殊类型的成员函数,用于在对象生命周期结束时被自动调用...
    99+
    2023-05-19
    C++析构函数的使用 C++析构函数学习 C++析构函数 C++ 函数
  • 一文带你学习Java中的线程
    目录介绍线程通用的线程生命周期Java 的线程生命周期Java 的线程状态切换从 NEW 到 RUNNABLE 状态从 RUNNABLE 到 TERMINATED 状态1. RUNN...
    99+
    2023-05-20
    Java 线程 Java线程总结
  • 一文带你学会Java事件机制
    目录委托事件模型核心组件总结相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控件的绑定,当我们需要在点击某个按钮实现某些操作的时...
    99+
    2024-04-02
  • C++中的派生机制是什么
    这篇文章主要介绍“C++中的派生机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中的派生机制是什么”文章能帮助大家解决问题。一、派生的类型C++支持以下几种派生类型:公有派生: 在公有...
    99+
    2023-07-06
  • 一文带你了解Java中的SPI机制
    目录1: SPI机制简介2: SPI原理3: 使用场景4: 源码论证5: 实战6: 优缺点6.1 优点6.2 缺点1: SPI机制简介 SPI 全称是 ...
    99+
    2023-05-15
    Java SPI机制原理 Java SPI机制使用 Java SPI机制
  • 一文带你了解MySQL中的锁机制
    目录一.概述 分类二.MyISAM表锁如何加表锁写锁演示三.InnoDB行锁行锁特点一.概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如CPU、RAM、I...
    99+
    2023-02-17
    MySQL锁机制使用 MySQL锁机制 MySQL锁
  • 一文带你学会C语言中的qsort函数
    目录铺垫知识使用qsort函数进行整型数组的排序使用qsort函数进行浮点型数组的排序使用qsort函数进行结构体数组的排序铺垫知识 qsort函数 参数类型  ...
    99+
    2022-12-21
    C语言 qsort函数 C语言 qsort
  • 一文带你读懂Java中的反射机制
    本篇文章为大家展示了一文带你读懂Java中的反射机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是反射机制反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且...
    99+
    2023-05-31
    java 反射机制 ava
  • 带你从头学习C++的封装
    目录封装属性和行为作为整体 实例—设计学生类访问权限class与struct区别成员属性私有化设计立方体类总结封装 c++认为万事万物皆为对象,对象上有其属性和...
    99+
    2024-04-02
  • 一篇文章带你学习python的函数与类
    目录函数模块类根据类创建实例继承总结现在做的一个小项目需要用到python的相关知识,但是因为太久没用一些东西都忘掉了,因此在本篇博客中记录一下python的函数和类的基础知识,下次...
    99+
    2024-04-02
  • 一篇文章带你学习Python3的高阶函数
    目录1.高阶函数2.map/reduce3.filter4.sorted总结1.高阶函数 # 1.变量指向函数 # 调用函数和函数本身 print("-10的绝对值为:",abs(-...
    99+
    2024-04-02
  • 一篇文章带你深入学习Python函数
    目录函数的特性:函数是对象:函数可以删除:总结函数的特性: 函数是对象函数可以删除函数名字和函数本身完全是分开的函数因为是对象,可以结合数据结构使用函数因为是对象,可以作为函数参数函...
    99+
    2024-04-02
  • 一篇文章带你了解C++Primer学习日记--处理数据
    目录1.简单变量1.1变量名1.2整型short,int,long和long long1.3无符号类型1.4选择整型类型1.5char类型2.const限定符3.浮点类型4.类型转换...
    99+
    2024-04-02
  • 带你一文了解C#中的Expression
    目录前言Expression与Expression Tree参考源码总结前言 我们书接上文,我们在了解LINQ下面有说到在本地查询IEnumerbale主要是用委托来作为传参,而解析...
    99+
    2024-04-02
  • 一篇文章带你学习Python3的高级特性(2)
    目录1.生成器2.迭代器总结1.生成器 # 一边循环一边计算的机制,称为生成器:generator; # 创建generator方法: # 1.把一个列表生成式的[]改成() num...
    99+
    2024-04-02
  • 一篇文章带你学习Python3的高级特性(1)
    目录1.切片2.迭代3.列表生成式总结1.切片 # 切片:取list或tuple的部分元素 nameList = ["Willard","ChenJD","ChenBao","Che...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作