一、虚析构
在析构函数前加上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