へのポインタへのポインタから基本クラスに変換できません:ソースファイルでは、ヘッダーでは、派生クラス
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
......
}
:main.cppには
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()));
......
}
:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NewClock c;
c.show();
return a.exec();
}
私が欲しいですNewClockを表示します。しかし私がコンパイルすると、エラーは "ポインタを基本クラス 'QObject'から仮想クラス 'Clock'を介して派生クラス '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);
}
どのようにこの問題を解決するために?私のコンストラクタとスロットに何か問題はありますか? ^
動的なオブジェクトと静的なオブジェクトの型が同じかどうかはどうすれば判断できますか? – Manhooo
この場合、NewClockの接続は動作しません。タイマーでElecClockを使用する場合は、そういうことができます。 'QApplication a(argc、argv); // NewClock c; ElecClock c; c.connect(); c.show(); return a.exec(); 'ここで、connect関数は接続部分をカプセル化しています。 – ebeglary