首页 > 编程语言 >C++ 继承同名Impl简单测试构造顺序析构顺序

C++ 继承同名Impl简单测试构造顺序析构顺序

时间:2024-09-13 21:47:47浏览次数:8  
标签:顺序 num C++ say Base ----- 析构 Impl

 
/*****class Base*****/

class Base
{
public:
    Base();
    virtual ~Base();
protected:
    struct Impl;
    Impl* m_Impl;
};

struct Base::Impl
{
    int num{ 100 };
};

Base::Base()
{
    m_Impl = new Impl;
    std::cout << "Base 构造!" << '\n';
}
Base::~Base()
{
    if (m_Impl)
    {
        delete m_Impl;
        m_Impl = nullptr;
        std::cout << "Base 析构!" << '\n';
    }
}

/********class A*********/

class A :public Base
{
public:
    A();
    ~A();
    void say();
protected:
    struct Impl;
    Impl* m_Impl;
};

struct A::Impl
{
    std::string name{ "A dog man!" };
};

A::A()
{
    m_Impl = new Impl;
    std::cout << "A 构造!" << '\n';
}
A::~A()
{
    delete m_Impl;
    std::cout << "A 析构!" << '\n';
}

void A::say()
{
    std::cout << "A say:" << '\n';
    std::cout << m_Impl->name << endl;
    std::cout << Base::m_Impl->num << endl;
    std::cout << '\n';
}

/********class B*********/

class B :public A
{
public:
    B();
    ~B();
    void say();
protected:
    struct Impl;
    Impl* m_Impl;
};

struct B::Impl
{
    std::string info{ "B is SB!" };
};

B::B()
{
    m_Impl = new Impl;
    std::cout << "B 构造!" << '\n';
}
B::~B()
{
    delete m_Impl;
    std::cout << "B 析构!" << '\n';
}

void B::say()
{
    std::cout << "B say:" << '\n';
    std::cout << m_Impl->info << endl;
    std::cout << A::m_Impl->name << endl;
    std::cout << Base::m_Impl->num << endl;
    std::cout << '\n';
}


int main()
{
    B* b = new B;

    std::cout << "-----分割-----" << '\n';
    b->say();

    std::cout << "-----分割-----" << '\n';
    b->A::say();
    delete b;

    system("pause");
    return EXIT_SUCCESS;
}

输出:

Base 构造!
A 构造!
B 构造!
-----分割-----
B say:
B is SB!
A dog man!
100

-----分割-----
A say:
A dog man!
100

B 析构!
A 析构!
Base 析构!

标签:顺序,num,C++,say,Base,-----,析构,Impl
From: https://www.cnblogs.com/huvjie/p/18412939

相关文章

  • Hash Table 哈希表工作原理介绍及C/C++/Python实现
    HashTable哈希表工作原理介绍及C/C++/Python实现哈希表(HashTable),也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。它提供了非常高效的数据检索、插入和删除操作。哈希表的基本原理是使用一个哈希函数将输入(通常是字符串)转换为一个......
  • C++入门基础知识65——【关于C++ 数据封装】
    成长路上不孤单......
  • C++入门基础知识66——【关于C++ 接口(抽象类)】
    成长路上不孤单......
  • 《C++中动态数组的实现与探索》
    在C++编程中,动态数组是一种非常重要的数据结构,它能够根据实际需求在运行时动态地调整大小,为程序员提供了极大的灵活性。本文将深入探讨如何在C++中实现动态数组,包括使用内置数据结构和自定义实现的方法,同时分析其性能特点和应用场景。一、引言在编程过程中,我们经常会遇......
  • 《C++程序中如何降低函数调用开销》
    在C++编程中,性能优化是一个至关重要的话题。函数调用开销虽然在很多情况下可能并不显著,但在一些对性能要求极高的场景下,减少函数调用开销可以带来显著的性能提升。本文将深入探讨在C++程序中如何减少函数调用开销,帮助开发者写出更高效的代码。一、引言随着软件应用的不......
  • A-计算机毕业设计定制:93904 家庭健康管理系统(免费领源码)可做计算机毕业设计JAVA、PHP
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,家庭健康管理系统被用户普遍使用,为方便用户能够可以随时进行家庭健康管理系统的数据信息管理,特开发了SSM家庭健康管理系......
  • GROUPBY 和开窗函数执行顺序的问题
    SELECTseller_idFROM(SELECTseller_id,RANK()OVER(ORDERBYSUM(price)DESC)ASrFROMSalesGROUPBYseller_id)sWHEREs.r=1;作者:SunnyCCCh链接:https://leetcode.cn/problems/sales-analysis-i/solutions/868818/partition-by-he-group-by-de-shi-yong-qu-n......
  • c++面试八股文(大公司通用)
    在C++面试中,常见的问题通常会围绕C++的基础知识、数据结构与算法、系统设计、编程技巧、以及实际应用中的场景。以下是华为C++面试中常见的“八股文”问题及其简要回答思路。1.C++语言基础C++中const的用法有哪些?回答:常量变量:constinta=10;指针常量:constint*p;(指向......
  • 《C++编程规范》六、构造、析构与复制
    目录第47条以同样的顺序定义和初始化成员变量使用这些函数之所以需要小心,其中一个原因是几乎一半的情况下编译器都会为我们生成代码。另一个原因是,C++默认时总是将类当作类似于值的类型,但是实际上并非所有的类型都类似于值(见第32条)。知道何时应该显式地编写(或者禁止)这些特殊......
  • ros 自定义消息(图像+标志位+位姿)python和c++发布和接受
      编译 脚本 v3_gaosi_img_pose_flag.sh#!/bin/bash#外部给与执行权限#sudochmod+xrun_ros_nodes.sh#定义ROS安装路径#安装时候添加到系统路径了不需要每次都sourceROS_SETUP="/opt/ros/noetic/setup.bash"#定义工作目录路径自己的工程没有加到系......