gpt4 book ai didi

c++ - 无法从指向基类的指针转换为指向派生类的指针

转载 作者:行者123 更新时间:2023-11-30 02:25:42 26 4
gpt4 key购买 nike

在标题中:

class Clock : public QWidget
{
Q_OBJECT
public:
explicit Clock(QWidget *parent = 0);
......
}

class ElecClock : virtual public Clock
{
Q_OBJECT
public:
explicit ElecClock(QWidget *parent = 0);
private slots:
void showTime(); //display two LCDNumber
......
}

class MechClock : virtual public Clock
{
Q_OBJECT
public:
explicit MechClock(QWidget *parent = 0);
......
}

class NewClock : public MechClock, public ElecClock //combination of Mechclock and ElecClock
{
Q_OBJECT
public:
explicit NewClock(QWidget *parent = 0);
private slots:
void showTime(); //display two LCDNumber
......
}

在源文件中:

Clock::Clock(QWidget *parent) :
QWidget(parent)
{
......
}

ElecClock::ElecClock(QWidget *parent) :
Clock(parent)
{
......
connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
......
}

MechClock::MechClock( QWidget *parent) :
Clock(parent)
{
......
}

NewClock::NewClock(QWidget *parent) :
MechClock(parent), ElecClock(parent), Clock(parent)
{
......
connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
......
}

在 main.cpp 中:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NewClock c;
c.show();

return a.exec();
}

我想展示 NewClock。但是当我编译时,错误是“无法通过虚拟基类‘Clock’从指向基类‘QObject’的指针转换为指向派生类‘ElecClock’的指针。”

错误发生在 moc_ElecClock.cpp 中:

void ElecClock::qt_static_metacall(QObject *_o, QMetaObject::Call _c,int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
ElecClock *_t = static_cast<ElecClock *>(_o); // this line
Q_UNUSED(_t)
switch (_id) {
case 0: _t->showTime(); break;
default: ;
}
}
Q_UNUSED(_a);
}

如何解决这个问题?我的构造函数和插槽有什么问题吗? ^

最佳答案

static_cast这样做:静态转换被称为静态,因为转换所需的计算是在编译时完成的,无论是指针运算还是转换。

但是,当虚拟继承 存在时,事情就变得有点困难了。主要问题是虚拟继承的所有子类共享子对象的同一个实例。为了做到这一点,ElecClock将有一个指向 `` 的指针,而不是 Clock正确的,和Clock基类对象将在 ElecClock 之外实例化.

尽管如此,在编译时不可能推导出必要的指针算法。这取决于对象的运行时类型。

解决方案

你需要RTTI (运行时类型信息),以及使用 RTTI 进行转换是 dynamic_cast 的工作.

安全

static_cast只要不变量成立,从基础到派生就是安全的。否则结果为 undefined behavior .然而,对大型代码库的广泛部分强制执行的不变量很少保持不变。

所以当使用 static_cast 时在类似情况下,考虑放置 assert(dynamic_cast<...>(...))之前。

关于c++ - 无法从指向基类的指针转换为指向派生类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43897750/

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