• 16483阅读
  • 6回复

QT类多重继承的问题,QT是否对多重继承有特别的要求? [复制链接]

上一主题 下一主题
离线sanghk
 

只看楼主 倒序阅读 楼主  发表于: 2009-03-03
— 本帖被 XChinux 执行加亮操作(2009-03-03) —
有一个接口类:
class PropertyInface
{
public:
     virtual QStringList getPropertys() =0;
}

然后写了个派类:
class  Item : public QObject ,public PropertyInface
{
   Q_OBJECT
public:
    QStringList getPropertys() ;
public:
   其它方法
}

在其它的类中有个函数:updateInfo( PropertyInface* prop ) ;

如果调用此函数时:
Item* myitem  = new  Item();
....
updateInfo(myitem);

则在updateInfo函数内部,在调用getPropertys() 时可能会出错,
如果使用如下调用:
PropertyInface* inf = ......  
updateInfo(inf);

则在updateInfo函数内部调用inf.property("objectName")等QObject及Item中的方法时也会出错。

在调试时发现,调用inf->getPropertys()时,实际调用的是Item的其它函数。好像Item的虚函数表发生的混乱,把QObject及PropertyInface的虚函数地址处理错了。

请教各位,这种问题如何解决?>>>>>

接口类PropertyInface实际定义的函数为:
virtual QList<ProperyInfo> getPropertys() =0;

ProperyInfo是我定义的一个类,保存属性信息。为了能在QVariant中使用用了一个宏:
Q_DECLARE_METATYPE( ProperyInfo  ) 会不会是这个宏造成的 ?

ProperyInfo定义如下:
class   ProperyInfo{
public:
公有方法有变量 
public:
ProperyInfo();
ProperyInfo(const ProperyInfo& orig  );
ProperyInfo &operator=(const ProperyInfo& orig );

private:
私有的方法及变量 
[ 此帖被sanghk在2009-03-03 14:17重新编辑 ]
离线XChinux

只看该作者 1楼 发表于: 2009-03-03
class  Item : public QObject ,public PropertyInface
{
   Q_OBJECT
public:
    virtual QStringList getPropertys() ;
public:
   其它方法
}

试验一下。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线foxyz

只看该作者 2楼 发表于: 2009-03-03
请把class  Item : public QObject ,public PropertyInface
改成class  Item : public PropertyInface, public QObject
离线sanghk

只看该作者 3楼 发表于: 2009-03-03
二楼的方法已经试过了,不行。
三楼的方法,QT要求 QObject必须在非QT类前,也不行。
离线sanghk

只看该作者 4楼 发表于: 2009-03-03
Re:QT类多重继承的问题,已解决!
我是在一个函数中调用的:void myfun(  PropertyInface* inf);
在调用前:
void* obj = 从其它的函数中得到PropertyInface*, obj实际为一个Item*
PropertyInface* inf =(PropertyInface*)obj; //此错不正确,不能直接转换 就使用动态转换
myfun( inf);
离线eric_zh
只看该作者 5楼 发表于: 2009-03-04
向上转型时能将QObject子类转为非QObject类吗
离线80486

只看该作者 6楼 发表于: 2009-03-04
应该说public继承向上转化是相当相当安全的。
PropertyInface* inf =(PropertyInface*)obj;
这样做是不对的 直接使用 PropertyInface* inf =obj.
或者使用dynamic_cast操作符。
你使用的是什么编译器
快速回复
限100 字节
 
上一个 下一个