QObject 基类到继承对象的 C++ 类型转换

Posted

技术标签:

【中文标题】QObject 基类到继承对象的 C++ 类型转换【英文标题】:C++ type conversion of a QObject base class to an inherited object 【发布时间】:2015-02-16 13:57:00 【问题描述】:

我有 A(..):QObject(..)B(..):A(..) 类,并创建了一个对象 A,稍后应将其转换/扩展为类型 B:

A* obA = new A(...);
obA->setMember(true);
...
#ifdef EITHER
obA = new B(...); // --> shouldBeTrue == false, see below
#else
*obA = B(...);  // --> Error - see question
#endif
bool shouldBeTrue = obA->getMember();

原因是我在创建基础对象时还不知道最终的类型。我希望能够使用更精细的类型扩展此对象,然后可以访问基础对象成员。

我了解 C++ 支持类型转换,但我的代码会导致错误,因为它调用 QObject 的复制运算符,故意将其设为私有以防止复制 QObject“树”。

这是一个概念问题吗?我是不是弄错了指针?


编辑:添加了可编译但未按我预期执行的替代行。

【问题讨论】:

应该是obA = new B(...); 而不是*obA = new B(...);:) 对不起,我的错误当然是:您的修复程序编译但似乎覆盖了对象,因为在尝试转换后成员不是true。我现在已经更改了代码,所以它正确地给出了描述的错误。 我认为您在这里理解错误,您希望基类指针指向派生类对象以实现多态性,在您的情况下,您只是用派生类对象覆盖基类对象. 我希望派生类对象通过更改基类对象的类型来拥有基类对象的数据。但我可能会重载派生构造函数以接受基类对象并复制其数据? 【参考方案1】:

克隆QObject 是概念错误。见:QObject documentation

要从B : public A 的新实例访问A : public QObject 的现有实例,您可以将指向现有实例的指针传递给构造函数中的新实例。

A *a = new A();
B *b = new B(a);

B 的构造函数中,你可以对A 的实例做任何你想做的事情,例如复制其数据部分。

【讨论】:

谢谢,但克隆不是有意的,我在评论中建议从构造函数中的引用对象复制数据。

以上是关于QObject 基类到继承对象的 C++ 类型转换的主要内容,如果未能解决你的问题,请参考以下文章

基类到派生类类型转换

C++继承详解

C++继承详解

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承