gpt4 book ai didi

c++ - 在调用基类之前需要调用成员的方法

转载 作者:行者123 更新时间:2023-11-30 03:14:16 24 4
gpt4 key购买 nike

我有类似下面的代码:

template<class BASE_TYPE = COdbcQuery>
class CRemoteQuery : public BASE_TYPE
{
CRemoteDatabase m_Db;

public:
CRemoteQuery()
: BASE_TYPE(&m_Db)
{
}

~CRemoteQuery()
{
}
};

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

如果我调用一个方法作为调用 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,这与它是它自己的类成员时没有什么不同。

but template classes cannot override virtual methods.

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

关于c++ - 在调用基类之前需要调用成员的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com