我正在尝试通过 C++ 继承对一些与数据库相关的功能进行建模。数据库中有大约 150 个表。并且这些表属于特定组,并且可以以类似的方式对特定组中的表进行操作(查询、写入等)。
class BaseTable(){
//Functionalities common for all tables. Eg: a create_table method.
}
class Group1Table(): BaseTable{
//Inherits from BaseTable and overrides(virtual function) or adds new functionlities.
}
class Group2Table(): BaseTable{
//Inherits from BaseTable and overrides(virtual function) or adds new functionlities.
}
可能有更多的 GroupTables,继承也可以更深层次。
通过这种继承,我可以像这样初始化一个映射:
std::map<int, boost::shared_ptr<BaseTable> > tablesMap = boost::assign::map_list_of(1, new BaseTable(x,y,z))(2, new Group1Table(p, q, r) ....(150, new GroupXTable(a, b, c)
因此,tablesMap 将包含所有 150 个表的映射(为简单起见,我按升序使用了简单的键。但键可能不同。因此使用映射而不是向量)。有了这张地图,我可以迭代并调用 x->create_table()、x->query() 等。或者当我想对特定表执行特定操作时,我可以简单地调用
tablesMap[key]->action()
并且多态性将负责调用正确的函数。
我担心的是存储这些动态多态对象并像我上面描述的那样使用它是否存在开销。还是我只是偏执?请注意,映射中总是有固定数量的对象被初始化一次(约 150 等于表的数量),我将遍历这些对象并在需要的地方调用各种虚拟函数。
有没有更好的方法来模拟问题,以便我可以避免使用虚函数?我试图按照 CRTP(静态多态性)的思路进行思考,但我想不出一种方法将对象放入映射中并像使用动态多态性一样遍历它们。