20200304
Plan
60min: ClickHouse
Notes
ClickHouse
今天主要进行了主流程的感知,目前知道初始化工作是在 dbms/programs/server/Server.cpp 的 main 方法中启动的,其中所有的 databases 放在了 global_contex 中,目前了解到的层级是:Server->global_context->Databases(IDataBase)->Tables(IStorage)。
其中 IDatabase 是是管理 table 的,而 table 是本质上是一个 IStorage,IStorage 管理具体的数据存储,因此明天的主体流程可以把经历集中在 IStorage 上面。
cpp 误区
动态绑定
基类里面调用一个 virtual method,如果 this 指针实际上是一个派生类的话,会动态绑定到派生类的方法上,可以参考下面的例子:
#include <iostream>
class Base {
public:
virtual void run() {
init();
std::cout << "Base::run" << std::endl;
}
virtual void init() { std::cout << "Base::init " << std::endl; }
};
class Derived : public Base {
public:
void run() override {
std::cout << "Derived::run" << std::endl;
Base::run();
}
void init() override { std::cout << "Derived::init" << std::endl; }
};
int main() {
Derived d;
d.run();
return 1;
}
try catch
此外还看到这样的 try catch block,用于 catch 所有的异常:
try {
}catch(...) {
}
继承模版类
一个模版类如果实例化之后,那么就是一个实例类,那么也就可以用来继承。
More
- global_context 中设定了一个指针用于指向自己,有什么用处?
- 动态绑定的逻辑确实是符合逻辑的,但是在这种模式下,是不是 OOP 使用起来会有比较多的误区?(可以参考 Server 和 Application 的关系)。