首页 > 编程语言 >C++的保护类型还能这么玩

C++的保护类型还能这么玩

时间:2024-04-10 13:24:37浏览次数:14  
标签:调用 函数 C++ 保护 protected 析构 基类 类型 定义

将一个类的析构函数定义为  protected 保护类型:

这个类就不能在外部被析构,被定义。只能在它的子类,或者它的友元类里面去定义。

定义了 保护类型的 析构函数,它的声明周期在 子类或者 友元类里面自动管理。

最主要理解它的限制,理解生命周期就好。

 

定义为保护类型的好处:

将一个类的析构函数定义为 protected 类型在某些情况下是有用的,主要是为了控制类的继承和对象的生命周期。以下是几种情况下将析构函数定义为 protected 的用途:

  1. 基类设计限制:当你设计一个基类时,你可能希望阻止其他类直接实例化该基类,而只能通过继承该基类来创建对象。将析构函数定义为 protected 可以防止直接实例化该基类,只有派生类才能调用基类的析构函数,从而实现了对基类对象的间接控制。

  2. 限制继承:有时,你可能希望只允许特定的派生类实例化,而不是所有的派生类。将基类的析构函数定义为 protected 可以确保只有派生类可以调用析构函数,而其他类则不能。

  3. 对象生命周期管理:在某些情况下,你可能需要手动管理对象的生命周期,而不是依赖于自动的栈上或堆上的对象销毁。将析构函数定义为 protected 可以防止用户直接销毁对象,只能通过派生类的方法来释放资源,从而更灵活地管理对象的生命周期。

  4. 资源管理:如果类持有某些资源(如文件句柄、数据库连接等),你可能希望确保这些资源在对象销毁时得到正确释放。将析构函数定义为 protected 可以让你控制资源的释放过程,并确保资源在适当的时候被释放,避免资源泄漏。

总的来说,将析构函数定义为 protected 类型可以提供更加灵活的对象生命周期管理和资源管理机制,并控制对象的继承和销毁行为,从而增强了类的封装性和安全性。

 

#include <iostream>
#include <cstdint>
#include <string>
#include <cstring>


class BaseA {
protected:
    BaseA() { std::cout << "BaseA 构造函数被调用" << std::endl; }
    ~BaseA() { std::cout << "BaseA 析构函数被调用" << std::endl; }

    friend class BaseB; // 将BaseB声明为友元类
public:
    void print() { std::cout << "这是BaseA类的print函数" << std::endl; }    
};

class BaseB {
private:
    BaseA objA;  // BaseA的对象作为成员变量

protected:
    BaseB() { std::cout << "------- BaseB 构造函数被调用" << std::endl; }
    ~BaseB() { std::cout << "------- BaseB 析构函数被调用" << std::endl; }

public:
    void print() { 
        std::cout << "------- 这是BaseB类的print函数" << std::endl; 
        objA.print(); // 调用BaseA类的print函数
    }
};

class DriveC : public BaseB {
public:
    DriveC() { std::cout << "<<<----->>> DriveC 构造函数被调用" << std::endl; }
    ~DriveC() { std::cout << "<<<----->>> DriveC 析构函数被调用" << std::endl; }

    void print() { 
        std::cout << "<<<----->>> 这是DriveC类的print函数" << std::endl; 
        BaseB::print(); // 调用BaseB类的print函数
    }
};




int main(){

   
    DriveC c;  // 创建DriveC对象
    std::cout<<"-------------------------------------------\r\n";
    c.print(); // 调用DriveC对象的print函数

   
    return 0;
}

输出结果:

BaseA 构造函数被调用
------- BaseB 构造函数被调用
<<<----->>> DriveC 构造函数被调用
-------------------------------------------
<<<----->>> 这是DriveC类的print函数
------- 这是BaseB类的print函数
这是BaseA类的print函数
<<<----->>> DriveC 析构函数被调用
------- BaseB 析构函数被调用
BaseA 析构函数被调用

 

标签:调用,函数,C++,保护,protected,析构,基类,类型,定义
From: https://www.cnblogs.com/music-liang/p/18125814

相关文章

  • C++初阶:6.string类
    string类string不属于STL,早于STL出现看文档C++非官网(建议用这个)C++官网文章目录string类一.为什么学习string类?1.C语言中的字符串2.两个面试题(暂不做讲解)二.标准库中的string类1.string类(了解)2.string类的常用接口说明(注意下面我只讲解最常用的接口)(1)......
  • C++类拷贝控制 深拷贝 浅拷贝
    参考博文:https://www.cnblogs.com/zhxmdefj/p/11579364拷贝构造函数,拷贝赋值运算符拷贝构造函数第一个参数是自身类类型引用,其他参数都有默认值的构造函数就是拷贝构造函数。classSales_data{public:   Sales_data();  //默认构造函数   Sales_data(const......
  • C++U4新-第06课-二分答案
    二分答案学习目标 先学习单调性,二分查找的单调性意思二分答案单调性 二分答案的思路  [【二分答案】-砍树] #include<iostream>usingnamespacestd;intmain(){intn,m;inttree[1000005];cin>>n>>m;for(inti=1;i<=n;i......
  • C++ - VS2019配置Qt开发环境
    下面正式介绍VS2019+Qt5.14.2开发环境的配置,其它版本类似,安装步骤如下:注意:首先自行安装好vs2019和qt5.14.2再执行以下步骤1、VisualStudio2019配置Qt环境(1)插件下载安装点击VS上方的菜单栏,选择“拓展—>管理拓展”进入管理拓展对话框,在右上方搜索qt,出现搜索结果后,选择......
  • 百度驾驶证C++离线SDK V1.1 C#接入
    百度驾驶证C++离线SDKV1.1C#接入目录说明 效果 项目代码下载 说明 自己根据SDK封装了动态库,然后C#调用。SDK包结构效果 项目代码usingNewtonsoft.Json;usingOpenCvSharp;usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnosti......
  • 【leetcode面试经典150题】26.判断子序列(C++)
    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)【题目描述】给定字符串 s 和 t ......
  • 强制转换视图某个字段为某个类型的sql
    selectcast(`a`.`status`ASSIGNEDINTEGER)AS`status`,`a`.`TAGNAME`AS`TAGNAME`from(selecttruncate(`v_mes_snapshots`.`numbervalue`,0)AS`status`,`v_mes_snapshots`.`TAGNAME`AS`TAGNAME`from`mysql`.`v_mes_snapshots`where......
  • 第十一届蓝桥杯C/C++组C组决赛之思维风暴 快速解题
    十五届蓝桥杯即将开赛,十一届的蓝桥杯国赛的一些巧妙解法。美丽的2 题目描述本题为填空题,只需要算出结果后,在代码中使用输出语包将所填结果输出即可。小蓝特别喜欢2,今年是公元2020年,他特别高兴。他很好奇,在公元1年到公元2020年(包含)中,有多少个年份的数位中包含数字2?......
  • c++中的缺省参数
    c++相对于C语言的一个新的语法叫做缺省参数。什么叫做缺省参数呢???我们先来看我们已知的Add函数缺省参数就是给x和y赋一个默认的值  我们可以根据自己的需要将x或者y给上缺省值看下面一个例子: 如果我们将函数中所有的参数都给上了缺省值,我们也叫这些参数为全缺省参数......
  • C++11:超进化--lambda表达式
    目录一、lambda表达式的引入二、lambda表达式的语法2.1lambda表达式各部分说明2.2lambda函数的初步使用2.3详谈捕捉列表2.3.1[var][&var] 2.3.2[=]传值捕捉当前域所有对象 2.3.3[&]传引用捕捉所有对象2.3.4[&,val]混合捕捉​编辑 三、lambda底层、lambda与函数对......