多态
1、拿基类的指针,实际执行派生类的对象;用基类的指针执行派生类的函数,实际执行的是字子类的执行覆盖版本,而不是基类中的原始版本,称为"多态"
2、虚函数:允许覆盖;实现原理是通过虚函数表,执行时才知道是执行派生类的方法还是基类的方法;
3、纯虚函数,类也变成了抽象类,不能直接实例化
4、虚析构函数可以帮助先执行子类的析构函数,再执行父类的析构函数,否则只执行父类的析构函数,不执行派生类的析构函数
5、LOG(INFO) << "typeid:" << typeid(e).name(); // 查看是什么类型
6、pb = dynamic_cast<Base*>(&d); // 向上转换,派生类向基类转化
7、深拷贝就是给指针重新指向一块地址,避免一块内存被释放2次;
8、互斥锁的使用
c++
复制代码
#include <pthread.h>
#include <sched.h>
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&gmutex.g_mutex);
pthread_mutex_unlock(&gmutex.g_mutex);
9、条件变量的使用
c++
复制代码
// 条件变量主要用于生产者和消费者问题
// 必要性:为了实现等待某个资源,让线程休眠,提高运行效率
// 如果使用死循环,效率较低
// 要和互斥量一起使用
#include <pthread.h>
#include <sched.h>
pthread_cond_t has_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *product2(void *arg)
{
LOG(INFO) << "product2";
int i = 0;
while (1) // 不停的生成
{
pthread_mutex_lock(&lock);
a.push_back(i);
LOG(INFO) << "push value:" << i;
i = i+1;
LOG(INFO) << "发送single" ;
pthread_cond_signal(&has_cond);
pthread_mutex_unlock(&lock);
usleep(1000000);
}
return nullptr;
}
void *saler2(void *arg)
{
LOG(INFO) << "saler";
while (1)
{
pthread_mutex_lock(&lock);
// 如果a是空的,就一直等待信号
if (a.empty())
{
LOG(INFO) << "等待single" ;
pthread_cond_wait(&has_cond, &lock);
LOG(INFO) << "等待single finish" ;
}
LOG(INFO) << "id:" << pthread_self() << "value:" << a[0];
a.erase(a.begin());
pthread_mutex_unlock(&lock);
usleep(1000000);
}
return nullptr;
}
int main()
{
pthread_t tid1, tid2;
// 生产者
// pthread_create(&tid1, NULL, product2, NULL);
// 消费者
pthread_create(&tid2, NULL, saler2, NULL);
usleep(1000);
pthread_create(&tid1, NULL, product2, NULL);
pthread_join(tid1,nullptr);
pthread_join(tid2,nullptr);
return 0;
}
单例模式:就是返回静态成员变量
模版就是就是显示指定类型
python
复制代码
Person<double>* obj = new Person<double>(12.3);
回调函数:就是将函数名当参数传给另一个函数
c++
复制代码
// 函数指针
#include <stdio.h>
#include <glog/logging.h>
void print_hello()
{
LOG(INFO) << "hello world";
}
typedef void (* pType)();
void print_hello_ptr(void (* p)())
{
p();
LOG(INFO) << "finish";
}
int main()
{
// pType p;
// p = print_hello;
// p();
print_hello_ptr(print_hello);
return 0;
}