C++例子

news2024/9/30 1:27:27
#include<iostream>
using namespace std;

//抽象类
//抽象cpu类
class CPU
{
public:
   virtual void calcuate()=0;
};
//抽象显卡类
class VideoCard
{
public:
   virtual void display()=0;
};
//抽象内存条类
class Memory
{
public:
  virtual void storage()=0;

};

//电脑类
class Computer
{
public:
  //构造函数
  Computer(CPU *cpu, VideoCard *vc, Memory *mem)
  {
   m_cpu = cpu;
   m_vc = vc;
   m_mem = mem;
  }
  //什么行为,提供变量工作的函数
  void work()
  {
    m_cpu->calcuate();
    m_vc->display();
    m_mem->storage();
  }
  ~Computer()
{
  if(m_cpu!=NULL)
  {
    delete m_cpu;
    m_cpu =NULL;
  }
if(m_vc!=NULL)
  {
    delete m_vc;
    m_vc =NULL;
  }
if(m_mem!=NULL)
  {
    delete m_mem;
    m_mem =NULL;
  }

}

private:
// 这个类先写private
   CPU *m_cpu;     //定义一个CPU的指针
   VideoCard *m_vc;
   Memory *m_mem;


};

//具体厂商
//intel厂商
class IntelCPU : public CPU
{
public:
   virtual void calcuate()
   {
    cout<<"Intel的CPU开始计算了!"<<endl;
   }

};

class IntelVideoCard: public VideoCard
{
public:
   virtual void display()
   {
    cout<<"Intel的显卡开始计算了!"<<endl;
   }
};

class IntelMemory: public Memory
{
public:
   virtual void storage()
   {
    cout<<"Intel的存储开始计算了!"<<endl;
   }
};

// lenovo
class LenovoCPU : public CPU
{
public:
   virtual void calcuate()
   {
    cout<<"Intel的CPU开始计算了!"<<endl;
   }

};

class LenovoVideoCard: public VideoCard
{
public:
   virtual void display()
   {
    cout<<"Intel的显卡开始计算了!"<<endl;
   }
};

class LenovoMemory: public Memory
{
public:
   virtual void storage()
   {
    cout<<"Intel的存储开始计算了!"<<endl;
   }
};


void test01()
{
    //第一台电脑零件
    //new返回的是同类型的指针
    //int *p= new int  或int[10]
    CPU *IntelCpu = new IntelCPU;
    VideoCard * IntelCard = new IntelVideoCard;
    Memory *IntelMem = new IntelMemory;
//创建第一台电脑
    Computer * computer1= new Computer(IntelCpu,IntelCard,IntelMem);
    computer1->work();
    delete computer1;
    //method1  继续释放new的
    // 放在析构中
    // delete IntelCPU;
    // delete IntelCard;
    // delete IntelMem;
//创建第二台
    cout<<"创建第二胎"<<endl;
    CPU *LenovoCpu = new LenovoCPU;
    VideoCard * LenovoCard = new LenovoVideoCard;
    Memory *LenovoMem = new LenovoMemory;
    //或者直接new
    // Computer *computer2 = new Computer( new LenovoCPU,new LenovoVideoCard,new LenovoMemory);
    Computer * computer2 = new Computer(LenovoCpu,LenovoCard,LenovoMem);
    computer2->work();
    delete computer2;

}
int main()
{
  test01();
//   system("pause");
  return 0;
}

在这里插入图片描述
在这里插入图片描述
cpu还没给m_cpu时,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
析构其它的new

二、

// #include<iostream>
// using namespace std;

// //抽象类
// //抽象cpu类
// class CPU
// {
// public:
//    virtual void calcuate()=0;
// };
// //抽象显卡类
// class VideoCard
// {
// public:
//    virtual void display()=0;
// };
// //抽象内存条类
// class Memory
// {
// public:
//   virtual void storage()=0;

// };

// //电脑类
// class Computer
// {
// public:
//   //构造函数
//   Computer(CPU *cpu, VideoCard *vc, Memory *mem)
//   {
//    m_cpu = cpu;
//    m_vc = vc;
//    m_mem = mem;
//   }
//   //什么行为,提供变量工作的函数
//   void work()
//   {
//     m_cpu->calcuate();
//     m_vc->display();
//     m_mem->storage();
//   }
//   ~Computer()
// {
//   if(m_cpu!=NULL)
//   {
//     delete m_cpu;
//     m_cpu =NULL;
//   }
// if(m_vc!=NULL)
//   {
//     delete m_vc;
//     m_vc =NULL;
//   }
// if(m_mem!=NULL)
//   {
//     delete m_mem;
//     m_mem =NULL;
//   }

// }

// private:
// // 这个类先写private
//    CPU *m_cpu;     //定义一个CPU的指针
//    VideoCard *m_vc;
//    Memory *m_mem;


// };

// //具体厂商
// //intel厂商
// class IntelCPU : public CPU
// {
// public:
//    virtual void calcuate()
//    {
//     cout<<"Intel的CPU开始计算了!"<<endl;
//    }

// };

// class IntelVideoCard: public VideoCard
// {
// public:
//    virtual void display()
//    {
//     cout<<"Intel的显卡开始计算了!"<<endl;
//    }
// };

// class IntelMemory: public Memory
// {
// public:
//    virtual void storage()
//    {
//     cout<<"Intel的存储开始计算了!"<<endl;
//    }
// };

// // lenovo
// class LenovoCPU : public CPU
// {
// public:
//    virtual void calcuate()
//    {
//     cout<<"Intel的CPU开始计算了!"<<endl;
//    }

// };

// class LenovoVideoCard: public VideoCard
// {
// public:
//    virtual void display()
//    {
//     cout<<"Intel的显卡开始计算了!"<<endl;
//    }
// };

// class LenovoMemory: public Memory
// {
// public:
//    virtual void storage()
//    {
//     cout<<"Intel的存储开始计算了!"<<endl;
//    }
// };


// void test01()
// {
//     //第一台电脑零件
//     //new返回的是同类型的指针
//     //int *p= new int  或int[10]
//     CPU *IntelCpu = new IntelCPU;
//     VideoCard * IntelCard = new IntelVideoCard;
//     Memory *IntelMem = new IntelMemory;
// //创建第一台电脑
//     Computer * computer1= new Computer(IntelCpu,IntelCard,IntelMem);
//     computer1->work();
//     delete computer1;
//     //method1  继续释放new的
//     // 放在析构中
//     // delete IntelCPU;
//     // delete IntelCard;
//     // delete IntelMem;
// //创建第二台
//     cout<<"创建第二胎"<<endl;
//     CPU *LenovoCpu = new LenovoCPU;
//     VideoCard * LenovoCard = new LenovoVideoCard;
//     Memory *LenovoMem = new LenovoMemory;
//     //或者直接new
//     // Computer *computer2 = new Computer( new LenovoCPU,new LenovoVideoCard,new LenovoMemory);
//     Computer * computer2 = new Computer(LenovoCpu,LenovoCard,LenovoMem);
//     computer2->work();
//     delete computer2;

// }
// int main()
// {
//   test01();
// //   system("pause");
//   return 0;
// }


#include<iostream>
using namespace std;

class base
{

public:
// 无参构造
   base()
   {
	cout<<"父类构造"<<endl;
   }

   ~base()
   {
    cout<<"父类析构"<<endl;

   }

};
class son :public base
{
public:
	son()
	{
		cout<<"儿子构造"<<endl;
	}

  ~son()
   {
    cout<<"儿子析构"<<endl;

   }


};


int main()
{
   son x;
   return 0;
}

输出结果:

父类构造
儿子构造
儿子析构
父类析构

debug信息

Breakpoint 1, main () at /mnt/workspace/test/test.cpp:208
208     {
(gdb) s
209        son x;
(gdb) 
son::son (this=0x7ffea3799fe7) at /mnt/workspace/test/test.cpp:193
193             {
(gdb) 
base::base (this=0x7ffea3799fe7) at /mnt/workspace/test/test.cpp:179
179             cout<<"父类构造"<<endl;
(gdb) 
父类构造
180        }
(gdb) 
son::son (this=0x7ffea3799fe7) at /mnt/workspace/test/test.cpp:194
194                     cout<<"儿子构造"<<endl;
(gdb) 
儿子构造
195             }
(gdb) 
main () at /mnt/workspace/test/test.cpp:210
210        return 0;
(gdb) 
211     }
(gdb) 
son::~son (this=0x7ffea3799fe7, __in_chrg=<optimized out>) at /mnt/workspace/test/test.cpp:199
199         cout<<"儿子析构"<<endl;
(gdb) 
儿子析构
201        }
(gdb) 
base::~base (this=0x7ffea3799fe7, __in_chrg=<optimized out>) at /mnt/workspace/test/test.cpp:184
184         cout<<"父类析构"<<endl;
(gdb) 
父类析构
186        }
(gdb) 

#include
using namespace std;

class base
{
public:
virtual void sample()=0;
};

class son :public base
{
public:
virtual void sample()
{
cout<<“快得很”<<endl;
}

};

int main()
{
   son x;
   //调用方法才有输出
   x.sample();


   son *p = new son;
   p->sample();
   delete p;
   return 0;
}

输出两次,
快得很
快得很

3)

#include<iostream>
using namespace std;

class base
{
public:
 base(int &m,int &n)
 {
  m1=m;
  n1=n;
 
 }
 void prit()
 {

   cout<<"m:"<<m1<<"n:"<<n1<<endl;

 }
  // virtual void sample()=0;
  void  fun(){}
private:
  int m1;
  int n1;
};


class son :public base
{
public:
  virtual void sample()
  {
   cout<<"快得很"<<endl;
  }


};


int main()
{
  //  son x;
  //  //调用方法才有输出
  //  x.sample();
  int c=10;
  int b =20;
  //抽象类不能直接直接实例化
  base a(c,b);
  a.prit();


抽象类不能直接直接实例化,去掉虚幻书,加上fun的一个空定义

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

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

相关文章

vue3+ts+vite axios封装请求并扩展入参

requset.ts import axios, { AxiosResponse } from axios import { getToken, removeToken } from /utils/auth// 创建axios实例 const service axios.create({baseURL: , // 所有的请求地址前缀部分(没有后端请求不用写)timeout: 60000 // 请求超时时间(毫秒)// withCredent…

LeetCode---389周赛

题目列表 3083. 字符串及其反转中是否存在同一子字符串 3084. 统计以给定字符开头和结尾的子字符串总数 3085. 成为 K 特殊字符串需要删除的最少字符数 3086. 拾起 K 个 1 需要的最少行动次数 一、字符串及其反转中是否存在同一子字符串 直接暴力枚举即可&#xff0c;代码…

Linux(Centos)安装mysql 8 并且使用systemctl管理服务

1.下载mysql包 地址 MySQL :: Download MySQL Community Server (Archived Versions) 注&#xff1a;下载我圈住的减压之后里面会有tar.gz 再次减压才会是软件主体 2.安装和准备 yum -y install numactl 安装numactl tar -xvf mysql-8.0.30-el7-x86_64.tar 拆分 …

算法思想总结:位运算

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、常见的位运算总结 标题 二、位1的个数 . - 力扣&#xff08;LeetCode&#xff09; 利用第七条特性&#xff1a;n&&#xff08;n-1&#xff09;干掉最后一个1&#xff0c;然后每次都用count去统计&#xff…

目标检测——PP-YOLOv2算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…

【算法与数据结构】 C语言实现单链表队列详解

文章目录 &#x1f4dd;队列&#x1f320; 数据结构设计&#x1f309;初始化队列函数 &#x1f320;销毁队列函数&#x1f309;入队函数 &#x1f320;出队函数&#x1f309;获取队首元素函数 &#x1f320;获取队尾元素函数&#x1f309; 判断队列是否为空函数&#x1f309;获…

学习ReentrantLock 原理

ReentrantLock 与 synchronized 锁的实现&#xff1a;synchronized 是 JVM 实现的&#xff0c;而 ReentrantLock 是 JDK 实现性能&#xff1a;新版本 Java 对 synchronized 进行了很多优化&#xff0c;synchronized 与 ReentrantLock 大致相同使用&#xff1a;ReentrantLock 需…

tauri应用实现一键快速更新版本

tauri应用实现一键快速更新版本 创建一个项目 pnpm create tauri-app根据配置选择就可以 pnpm tauri dev启动项目 ##更新配置 打包配置在src-tauri/tauri.conf.json 修改打包命令 "bundle": {"active": true,"targets": "all",&qu…

石子合并与果子合并:区间动态规划和贪心

果子合并是如何将一堆果子合并起来所消耗体力最少&#xff0c;石子合并也是将一堆石子合并起来质量最小&#xff0c;但不同的是 石子合并只能相邻的两个合并 。本篇通过讲解这两个相似例题&#xff0c;来学习区间dp与贪心。 目录 石子合并&#xff1a; 题目&#xff1a; 思路…

Dr4g0n

信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-04 08:52 CST Nmap scan report for 192.168.56.2 Host is up (0.00012s latency). MAC Address: 00:50:56:FE:B1:6F (VMware) Nmap scan report …

【Redis】Redisson实现分布式锁

Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务&#xff0c;其中就包含了各种分布式锁的实现。 官网地址 GitHub地址 Redisson入门 1.引…

docker安装ES7.1.1(单机版)+ik分词器+es-head可视化

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Elasticsearch 是一…

海外媒体发稿:7款爆款标题生成器解析-华媒舍

科普文章是将科学知识普及给大众的一种方式&#xff0c;而一个引人入胜的标题往往是吸引读者的第一步。在科普领域中&#xff0c;标题的吸引力至关重要。以下将介绍7款风靡科普界的爆款标题生成器&#xff0c;帮助你创作出引人入胜的科普文章。 1. 情感引爆 情感是人类行为中的…

卷积篇 | YOLOv8改进之主干网络中引入可变形卷积DConv

前言:Hello大家好,我是小哥谈。可变形卷积模块是一种改进的卷积操作,它可以更好地适应物体的形状和尺寸,提高模型的鲁棒性。可变形卷积模块的实现方式是在标准卷积操作中增加一个偏移量offset,使卷积核能够在训练过程中扩展到更大的范围,从而实现对尺度、长宽比和旋转等各…

QML 布局管理器之GridLayout 项目demo

一.气体控制效果图 二.界面布局代码实现 //DottedLline.qml 虚线绘制 import QtQuick 2.12 import QtQuick.Shapes 1.12Shape {id:canvaswidth: parent.widthheight: parent.heightShapePath{strokeStyle: ShapePath.DashLinestartX: 8startY: 10dashPattern: [1, 3]PathLine{…

多线程和线程同步

文章目录 进程和线程线程的操作线程创建线程退出线程回收线程分离线程取消和ID比较 线程同步互斥锁死锁读写锁条件变量信号量 进程和线程 线程是轻量级的进程&#xff0c;在Linux环境下线程的本质还是进程。 在计算机上运行的程序是一组指令及指令参数的组合&#xff0c;指令按…

Web前端-JS

JavaScript&#xff0c;简称js&#xff1a;负责网页的行为&#xff08;交互效果&#xff09;。是一门跨平台&#xff0c;面向对象的脚本语言&#xff08;编写出来的语言不需要编译&#xff0c;通过浏览器的解释就可以运行&#xff09; JS引入方式 1.内嵌样式 这样打开页面就会…

毕业答辩PPT模板涵盖多种风格,包括母版的设计及主题色的设计

毕业答辩PPT模板涵盖多种风格&#xff0c;包括母版的设计及主题色的设计 前言一两个页面的展示研究内容主题概述主题内容一&#xff1a;主要面向三点研究内容主题内容二&#xff1a;主要面向两点研究内容主题内容三&#xff1a;主要面向包含应用开发的研究 前言 之前做了有关开…

Oracle Data Guard部署

Oracle的主备DG搭建 1. 修改主机名,同步时间 主库IP&#xff1a;192.168.100.137 备库IP&#xff1a;192.168.100.138配置主机名(主库) Hostname zygjpdb vim /etc/hosts 192.168.100.137 zygjpdb 192.168.100.138 zygjsdbvim /etc/sysconfig/network HOSTNAMEzygjpdb ------…

电脑如何关闭自启动应用?cmd一招解决问题

很多小伙伴说电脑刚开机就卡的和定格动画似的&#xff0c;cmd一招解决问题&#xff1a; CtrlR打开cmd,输入&#xff1a;msconfig 进入到这个界面&#xff1a; 点击启动&#xff1a; 打开任务管理器&#xff0c;禁用不要的自启动应用就ok了