gpt4 book ai didi

C++ 和虚方法覆盖

转载 作者:太空狗 更新时间:2023-10-29 23:22:37 25 4
gpt4 key购买 nike

很抱歉这个愚蠢的问题,但我自己找不到答案,我对 C++ 太陌生了:(

class DBObject : public QObject
{
...
protected:
virtual QString tableName() = 0;
};

class DBUserObject : public DBObject
{
...
protected:
virtual QString tableName() { return "profiles"; };
};

我在父级中有这段代码:

DBObject::DBObject(quint32 id)
: QObject(0)
{
...

if (id != 0)
load(id);
}

bool DBObject::load(quint32 id)
{
QString query = QString("select %1 from %2 where id = :id")
.arg(fieldList().join(","))
.arg(tableName()); <--- here is trouble
...
}

所以我正在尝试执行:

DBUserObject user(3);

但结果我遇到了运行时错误。为什么不是“个人资料”?

最佳答案

根据 OP 的后续评论:

DBUserObject user(3). It is loading item in its constructor.

如果您指的是 DBObject 构造函数(而不是 DBUserObject 构造函数),那么这就是您的问题。虚函数在构造函数内部不起作用。构造函数从派生最少(最基类)的类运行到派生最多(实际类型)的类。当类的构造函数运行时,对象只是该类的类型,没有其他派生类型。

换句话说,当您创建一个 DBUserObject 时,首先运行 QObject 构造函数,并且在该构造函数内部对象只是一个 QObect仅此而已。然后,DBObject 构造函数运行,在该构造函数内部,对象只是一个 DBObject,仅此而已。最后,DBUserObject 构造函数运行,对象最终成为 DBUserObject

因此,如果您在 DBObject 构造函数中调用 load(),此时该对象只是一个 DBObject,因此只有加载的 DBObject 版本。这同样适用于任何虚函数。

如果你想获得调用 load()DBUserObject 版本的效果,你需要从 DBUserObject 中调用它构造函数,或在构造对象后从类外部访问。

更多信息:

关于C++ 和虚方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3053081/

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