1. 如果base class的构造函数中调用了虚函数,子类在构造时候调用的是谁的虚函数呢?
调用的是base class的虚函数,因为在子类构造时先调用base class的构造,此时子类还没构造,所以就是纯粹的父类的构造,
可以理解成此时vptr还是父类的虚函数表,子类的内容还没改呢。
而且在子类成员还没构造的时候也不能调用子类的方法。
可以说vptr一开始是父类的,在构造子类成员时才会检查虚函数表,对重写的进行替换。
2. 通过初始化列表进行初始化
int a{}; double d{};
像这样的写法,会用这个类型的默认值去初始化,int是0, double是0.0, 在class的成员变量设置默认值时除非有特殊默认值,随手写一个{}也是一个好习惯。
3.
当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个。同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...)
额外说明:lock_guard<mutex> lock_a(d1.m, std::adopt_lock);
上面这句是为了解开std::lock的锁。
参数std::adopt_lock的作用:告诉lock_guard,d1.m已经被上锁了,你不要再去锁它了,沿用它原来的锁就好。
4.condition_variable在notify的时候不需要在锁的保护下
5. reactor模型是在回调函数之前通知可以执行了,而proactor模型是回调函数执行完毕才会通知,相比之下proactor模型需要事先准备好回调函数的资源,占用资源更多
6. 关于boost库asio:https://m.w3cschool.cn/nlzbw/nlzbw-3vs825ya.html