C++ 抽象类+虚析构virtual、线程pthread+纯虚函数简单入门

在这里插入图片描述

一、虚析构

在析构函数前加上virtual关键字
构造函数: Person(){}
虚析构:~virtual(){}

二、什么时候用到虚析构

多态的时候,用父类指针指向子类对象,在delete父类指针的时候,不会调用子类的析构函数 解决方法是在父类析构函数前面添加virtual 关键字

#include <iostream>
using namespace std;
class AA
{
public:
  AA(){cout<<"AA"<<endl;}
  virtual ~AA(){cout<<"~AA"<<endl;};
};
class BB:public AA
{
  public:
  BB(){cout<<"BB"<<endl;}
  virtual ~BB(){cout<<"~BB"<<endl;};
  int a;
};
class CC:public BB
{
  public:
  CC(){cout<<"CC"<<endl;}
  virtual ~CC(){cout<<"~CC"<<endl;};
};

int main()
{
  
  AA *pt =new BB(); //申请了两次,构造函数被执行两次
  cout<<"______________________sizeof()="<<sizeof(pt)<<endl;
  
  delete pt;
  cout<<"pt_____________\n";
  AA *st = new CC(); //单独这行只打印AA ,BB
  delete st; //加上这个,打印AA,BB,~AA
  //virtual ~AA(){}  :加上关键字,打印全部
}

结果
// PS C:\Users\newuser\Desktop\C++\第六天C++> g++ .\虚析构函数.cpp
// PS C:\Users\newuser\Desktop\C++\第六天C++> ./a
// AA
// BB
// _________sizeof()=8
// ~BB
// ~AA
// pt

// AA
// BB
// CC
// ~CC
// ~BB
// ~AA

三、线程pthread在类中的使用

#include <iostream>
using namespace std;
extern "C"
{
  #include <pthread.h>
  #include <time.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  #include <windows.h>
}
class thread
{
  public:
    thread(){};
    ~thread(){};
  public:
    //触发线程
    void start(void);
    virtual void run() =0; //纯虚函数
  private:
    pthread_t tid;
};
//线程函数,只要在某个地方创建了线程,就会来执行这个函数
void *func(void *arg)
{
  thread*th = (thread *)arg; //强制转换为父类指针arg=this
  th->run();  //访问类内纯虚函数
  //自行运行
  return NULL;

}
//类内函数,创建线程,为了获取this指针,处理虚函数
void thread::start()
{
	//this是子类指针,但是放在基类vptr指向子类对象
    pthread_create(&tid,NULL,func,(void *)this);
}
class Time: public thread 
{
  public:
  virtual void run();
  private:
  
};
void Time::run()
  {
    while (1)
    {
      cout<<"时间管理大师"<<endl;
      //usleep(1000000); //(1,000,000 微秒 = 1秒)
      cout<<"2133"<<endl;
      //sleep(1);  //(1秒=1秒)
      Sleep(1000);  //(1000毫秒 =1秒)
      //
    }
  }
int main(int argc, char const *argv[])
{
  //thread ss; 错误,抽象类里有纯虚函数,基类不能创建对象
  Time st;  //派生类对象,产生this指针
  st.thread::start(); //创建线程

  pause();//暂停
  return 0;
}

结果

PS C:\Users\newuser\Desktop\C++\第六天C++> ./a
时间管理大师
2133
时间管理大师
2133
时间管理大师
2133
时间管理大师
2133

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值