C++ 类继承

news2024/9/23 23:32:24

目录

  • 类继承
    • 基类
    • 派生一个类
      • 构造函数访问权限
      • 派生类与基类之间的特殊关系
    • 完整demo

类继承

基类

#ifndef __TEST_1_H_
#define __TEST_1_H_
#include <iostream>
#include<string>
using namespace std;
typedef unsigned int uint;

//father class
class TableTennisPlayer
{
    private:
        string firstname;
        string lastname;
        bool hasTable;
    public:
        TableTennisPlayer(const string & fn = "none",const string & ln = "none",bool ht = false);

        void Name()const;
        bool HasTable()const{return hasTable;};
        void ResetTable(bool v) {hasTable = v;};        
};
#endif
#include "test_1.h"

//成员初始化列表语法
 TableTennisPlayer:: TableTennisPlayer(const string & fn ,
            const string & ln,bool ht ):firstname(fn),lastname(ln),hasTable(ht)
 {}

 void TableTennisPlayer::Name()const
 {
    std::cout << lastname << ", " << firstname << endl;
 }

在这里插入图片描述
这里用到了string的默认构造函数

#include "test_1.h"
int main()
{
    TableTennisPlayer player1{"Tara","Boomdea",false};
    player1.Name();
    if(player1.HasTable())
        cout << "player1:has a table\n";
    else
        cout << "player1:hasn't a table\n";
        
    return 0;
}

派生一个类

//derived class
class Rated_player : public TableTennisPlayer
{
    private:
        uint rating;
    public:
        Rated_player(uint r = 0,const string & fn = "none",const string & ln = "none",bool ht = false);
        Rated_player(uint r,const TableTennisPlayer & tp);
        uint Rating()const {return rating;}//内联函数
        void ResetRating(uint r){rating = r;}   
};

在这里插入图片描述
从上图可以看出,冒号指出Rated_player类的基类是TableTennisPlayer类,表明TableTennisPlayer是一个公有基类,这被称为公有派生,派生类对象包含基类对象。
使用公有派生,基类的公有成员将成为派生类的公有成员;基类的私有部分也将成为派生类的一部分,但只能通过基类的公有和保护方法访问。

  • 需要在继承特性中添加什么?
    1、需要自己的构造函数
    2、可以根据需要添加额外的数据成员和成员函数

构造函数访问权限

派生类不能直接访问基类的私有成员,必须通过基类方法进行访问。
创建派生类对象时,程序首先创建基类对象,这意味着基类对象应当在程序进入派生类构造函数之前被创建。
C++使用成员初始化列表语法来完成这种工作。

在这里插入图片描述在这里插入图片描述
如果不调用基类构造函数,程序将使用默认的基类构造函数。
在这里插入图片描述

有关派生类构造函数的要点如下:

  • 首先创建基类对象
  • 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
  • 派生类构造函数应初始化派生类新增的数据成员
    释放对象的顺序与创建对象的顺序相反,即首先执行派生类的析构函数,然后自动调用基类的析构函数。
  • 成员初始化列表只能用于构造函数

派生类与基类之间的特殊关系

  • 派生类对象可以使用基类的方法,条件是方法不是私有的
    在这里插入图片描述
  • 基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象

在这里插入图片描述

  • 不可以将基类对象赋给派生类引用,如果这样做的话,派生类引用能够为基对象调用派生类方法,这样将出现问题。例如,将Rated_player::Rating()方法用于TableTennisPlayer对象是没有意义的,因为TableTennisPlayer对象没有rating成员。

完整demo

#ifndef __TEST_1_H_
#define __TEST_1_H_
#include <iostream>
#include<string>
using namespace std;
typedef unsigned int uint;

//father class
class TableTennisPlayer
{
    private:
        string firstname;
        string lastname;
        bool hasTable;
    public:
        TableTennisPlayer(const string & fn = "none",const string & ln = "none",bool ht = false);

        void Name()const;
        bool HasTable()const{return hasTable;};
        void ResetTable(bool v) {hasTable = v;};
        

};

//derived class
class Rated_player : public TableTennisPlayer
{
    private:
        uint rating;
    public:
        Rated_player(uint r = 0,const string & fn = "none",const string & ln = "none",bool ht = false);
        Rated_player(uint r,const TableTennisPlayer & tp);
        uint Rating()const {return rating;}//内联函数
        void ResetRating(uint r){rating = r;}   
};

#endif
#include "test_1.h"

//成员初始化列表语法
 TableTennisPlayer:: TableTennisPlayer(const string & fn ,
            const string & ln,bool ht ):firstname(fn),lastname(ln),hasTable(ht)
 {}

 void TableTennisPlayer::Name()const
 {
    std::cout << lastname << ", " << firstname << endl;
 
 }

 
Rated_player :: Rated_player(uint r,const string & fn,
            const string & ln,bool ht) : TableTennisPlayer(fn,ln,ht),rating(r)
{
    //rating = r;
}

Rated_player ::Rated_player(uint r,const TableTennisPlayer & tp)
            : TableTennisPlayer(tp),rating(r)
{
    //rating = r;
}
#include "test_1.h"

int main()
{
    
    #if 0 
    TableTennisPlayer player1{"Tara","Boomdea",false};
    Rated_player rplayer1{1140,"Mallory","Duck",true};
    player1.Name();
    rplayer1.Name();
    if(player1.HasTable())
        cout << "player1:has a table\n";
    else
        cout << "player1:hasn't a table\n";

    if(rplayer1.HasTable())
        cout << "rplayer1:has a table\n";
    else
        cout << "rplayer1:hasn't a table\n";

    cout << "Rating:" << rplayer1.Rating() << endl;

    Rated_player rplayer2 = {1122,player1};
    rplayer2.Name();
    cout << "Rating:" << rplayer2.Rating() << endl;
    #endif
    
    /*
    基类指针或引用只能用于调用基类的方法
    */
    Rated_player rplayer(1140,"Mallory","Duck",true);
    TableTennisPlayer & rt = rplayer;
    TableTennisPlayer * pt = &rplayer;
    rt.Name();
    pt->Name();
    

    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《编译原理》2022年期末试卷

北京信息科技大学《编译原理》2022年期末考试 试卷附录

双指针-链表相交

面试题 02.07. 链表相交 同&#xff1a;160.链表相交 力扣题目链接 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保…

用c语言查找交通肇事者。

问题&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有3人目击事件&#xff0c;但都没有记住车号&#xff0c; 只记下车号的一些特征。 甲说&#xff1a;“牌照的前两位数字是相同的”。 乙说&#xff1a;“牌照的后两位…

如何高效阅读源码

最近在研究一款开源软件&#xff0c;从初步上手使用到源码分析&#xff0c;依靠看源码解决问题&#xff0c;可以说让自己在阅读源码能力上有了一点小的成长。鲁迅先生曾没说过&#xff0c;“源码是最好的文档”&#xff0c;他还没说过&#xff0c;“带着问题阅读源码最有效”。…

bat脚本添加以管理员权限执行方法

在windows上运行bat脚本的时候&#xff0c;有时候&#xff0c;会因为权限问题导致操作失败&#xff0c;这时候&#xff0c;需要在脚本中提升权限&#xff0c;以管理员权限执行脚本命令。 现在介绍两种方法可以实现管理员权限执行&#xff0c;如下所示&#xff0c;是一段以管理员…

【C++】STL的list容器介绍

目录 6、list容器 6.1list构造函数 6.2list赋值和交换 6.3list大小操作 6.4list插入 6.5list删除 6.6list数据存取 6.7list反转和排序 6、list容器 list本质是带头节点的双向循环链表&#xff0c;链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结…

学生必看!免费领取一台阿里云服务器

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

Redis 批处理优化

一、优化建议 1、使用Pipeline Redis 的 Pipeline 可以将多个命令打包成一个请求&#xff0c;从而减少通信次数和网络开销。在批处理时&#xff0c;可以使用 Pipeline 来提高效率。 2、使用批量插入 Redis 支持批量插入&#xff0c;可以将多个数据一次性插入数据库&#xf…

一文看完Vue3的渲染过程

Vue3官网中有下面这样一张图&#xff0c;基本展现出了Vue3的渲染原理&#xff1a; 本文会从源码角度来草率的看一下Vue3的运行全流程&#xff0c;旨在加深对上图的理解&#xff0c;从下面这个很简单的使用示例开始&#xff1a; import { createApp, ref } from "vue"…

Python3 列表与元组 | 菜鸟教程(六)

目录 一、Python3 列表 &#xff08;一&#xff09;简介相关 1、序列是 Python 中最基本的数据结构。 2、序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 3、Python 有 6 个序列的内置…

Qt编写手机版本视频播放器和Onvif工具(可云台和录像)

一、前言 用Qtffmpeg写播放器很多人有疑问&#xff0c;为何不用Qt自己的多媒体框架来写&#xff0c;最重要的原因是Qt自带的目前都依赖具体的本地解码器&#xff0c;如果解码器不支持&#xff0c;那就是歇菜的&#xff0c;最多支持个MP4格式&#xff0c;而且在手机上也都是支持…

有效的括号

数据结构与算法应用往往隐藏在我们看不到的地方 20. 有效的括号 力扣题目链接 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括…

【Python 随练】打印楼梯与笑脸

题目&#xff1a; 打印楼梯&#xff0c;并在楼梯上方打印两个笑脸 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码打印一个楼梯&#xff0c;并在楼梯上方打印两个笑脸。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来实现这个效果。 问题…

多目标优化算法:多目标浣熊优化算法(multi-objective Coati Optimization Algorithm,MOCOA)

一、浣熊优化算法COA 浣熊优化算法&#xff08;Coati Optimization Algorithm&#xff0c;COA&#xff09;由Dehghani Mohammad等人于2022年提出的模拟浣熊狩猎行为的优化算法&#xff0c;该算法具有进化能力强&#xff0c;收敛速度快&#xff0c;收敛精度高等特点。 COA具体…

【算法与数据结构】454、LeetCode 四数相加 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题不仅要计算元素的和为0&#xff0c;还要计算元素和为零出现的次数&#xff0c;说明这道题map比较…

【Python 随练】输出国际象棋棋盘

题目&#xff1a; 输出国际象棋棋盘 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码输出国际象棋棋盘。国际象棋棋盘是一个8x8的方格矩阵&#xff0c;交替使用黑色和白色方格。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来生成这个棋盘。…

C语言之指针详解(1)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 大家对比前面C语言之指针初阶来看&#xff0c;指针进阶明显看起来难度大了很多&#xff…

TLS协议详解,一文带你了解TLS协议

前言 TLS&#xff08;Transport Layer Security&#xff09;是一种安全协议&#xff0c;用于保护网络通信的安全性和隐私性。它是SSL&#xff08;Secure Sockets Layer&#xff09;的后继者&#xff0c;用于在互联网上建立安全的通信连接。本文将介绍TLS的概论、工作原理、发展…

计算机网络——物理层-数据通信的基础知识

物理层的基本概念 在计算机网络中&#xff0c;物理层是网络协议栈中的第一层&#xff0c;负责处理网络中传输数据的物理介质和信号传输的细节。它定义了传输数据的电气、光学和机械特性&#xff0c;以及物理连接的规范和接口标准。 物理层的主要任务是将比特流&#xff08;0和…

C++之AVL树

目录 一.介绍二.简单实现AVL树1. 基本框架2. 插入结点(Insert)a. 更新平衡因子b. 左单旋c. 右单旋d. 左右双旋e. 右左双旋 3. 删除节点(Erase)a. 更新平衡因子b. 旋转c. 代码 4. 测试 一.介绍 作为对二叉搜索树的优化版本。AVL树是由俄罗斯的两位数学家G.M.Adelson-Velskii和E.…