在调用基类之前需要在成员上调用方法

Need to call method on member before calling base class

本文关键字:调用 成员 方法 基类      更新时间:2023-10-16

>我有类似于以下内容的代码:

template<class BASE_TYPE = COdbcQuery>
class CRemoteQuery : public BASE_TYPE
{
CRemoteDatabase m_Db;
public:
CRemoteQuery()
: BASE_TYPE(&m_Db)
{
}
~CRemoteQuery()
{
}
};

我的问题是m_Db.Open()m_Db传递给基构造函数之前必须调用

。如果我调用一个方法作为调用Open()的基本构造函数的参数,它会失败m_Db因为尚未初始化。

我尝试在基类中创建一个虚拟方法,该方法将在初始化期间调用,并且此类可以覆盖,但模板类无法覆盖虚拟方法。

重组我的基类以便不需要先打开m_Db会引发许多难题。难道就没有办法吗?

通过进行小的设计更改,可以轻松实现以下事件序列:

class CRemoteDB {
protected:
CRemoteDatabase m_Db;
CRemoteDB()
{
m_Db.open();
}
};
template<class BASE_TYPE = COdbcQuery>
class CRemoteQuery : private CRemoteDB, public BASE_TYPE
{
public:
CRemoteQuery()
: BASE_TYPE(&m_Db)
{
}
~CRemoteQuery()
{
}
};

父类始终按声明顺序构造。首先构造CRemoteDB父类,然后在父类的构造函数中调用CRemoteDatabase::open()

然后构造BASE_TYPE,并获取指向打开的m_Db的指针。

CRemoteQuery可以从其父类访问m_Db,这与访问其自己的类成员没有什么不同。

但模板类不能重写虚拟方法。

附言谁告诉你这是错的。模板类当然可以覆盖虚拟方法。我这里有大量的模板层次结构,它们都覆盖了其父类的虚拟方法,左和右。