C++ 在指向父对象的指针上初始化子对象
安静的动机 我正在学习一个在Qt中使用模型的教程。 该示例显示以下代码:C++ 在指向父对象的指针上初始化子对象,c++,qt,pointers,polymorphism,C++,Qt,Pointers,Polymorphism,安静的动机 我正在学习一个在Qt中使用模型的教程。 该示例显示以下代码: //Header file class StringListModel : public QAbstractListModel //main.cpp QAbstractItemModel *model = new StringListModel(numbers); 下面解释一下 请注意,StringListModel被声明为QAbstractItemModel。这允许我们使用模型的抽象接口,并确保代码仍然有效,即使我们
//Header file
class StringListModel : public QAbstractListModel
//main.cpp
QAbstractItemModel *model = new StringListModel(numbers);
下面解释一下
请注意,StringListModel被声明为QAbstractItemModel。这允许我们使用模型的抽象接口,并确保代码仍然有效,即使我们用不同的模型替换字符串列表模型
我对他们的回答是这样理解的:
//Header file
class NewStringListModel : public QAbstractListModel
//main.cpp
//QAbstractItemModel *model = new StringListModel(numbers); Stoped using this, old
QAbstractItemModel *model = new NewStringListModel(numbers); //complete model change with just a single line
您可以在模型
上开发项目,如果您需要更改基础数据结构,您可以这样做:
//Header file
class NewStringListModel : public QAbstractListModel
//main.cpp
//QAbstractItemModel *model = new StringListModel(numbers); Stoped using this, old
QAbstractItemModel *model = new NewStringListModel(numbers); //complete model change with just a single line
通用化
- 这被认为是指针强制转换吗
- 如果子类实现了基类中不存在的方法,这会造成问题吗
pointerToParent->childMethodNotExistingInParent()
- 这种做法不好吗?若否,原因为何
这被认为是指针强制转换吗?
是的,指向NewStringListModel
的指针被强制转换到基类qabstractemmodel
如果子类实现了基类中不存在的方法,这会造成问题吗?
:没问题,通常需要实现基类中不存在的额外代码,但是只有当指针指向子类而不是基类时,才能使用它(或者在基类内实现虚拟函数)
这是一种不好的做法吗?如果不是,为什么不呢?
将不会编译,因为pointerToParent
的类型为QAbstractListModel
,因此NewStringListModel
中的任何实现都将无法访问。您需要使用静态转换或动态转换才能访问cild类型:
static\u cast(pointerToParent)->YourMethod()
-此检查在编译时键入,但如果您不能绝对确定pointerToParent
的类型是否为NewStringListModel
dynamic\u cast(pointerToParent)
是最安全的方法,但您需要使用RTTI,它是一种编译器。这会在运行时检查是否确实发生了强制转换。如果没有,它会引发异常(我不确定这方面的细节)
拉兹万。- 是的,它是一种隐式的向上转换(即,向上转换继承层次结构,从子级到父级)。这与显式转换不同,显式转换指定您期望的输出类型;它也不同于向下转换,从父级到子级,从继承层次结构向下转换
- 是的,子类中的新方法/成员有点问题。它们不能通过父类指针直接访问。但是,您可以使用
尝试将父指针转换为您期望的任何子类,并以这种方式访问新功能。但这不是一种理想的方法。您最好重构父/子类并使用dynamic_cast()
函数来避免这种情况virtual
- 一般来说,存储和使用父类指针并不是一种坏做法。事实上,如果类层次结构实现了“is-a”关系,这通常被认为是一种好做法,因为它保持了接口和实现之间的区别(理想情况下,一个不应影响另一个的设计).然而,试图通过(适当铸造的)父指针访问仅子功能是一个可疑的领域,因为它打破了接口实现的区别。尽管在极少数情况下是必要的
pointerToParent->childmethodnotexistingparent()行绝对不会编译。如果你需要做这样的调用,你需要把你的指针转换成合适的类型。但是实际上我不清楚,你想做什么?@ VHANCHO我想看看这是不是一个好的实践,什么时候我应该考虑使用它。在这种情况下,<代码> DyrimixCase应该返回一个空的PO。inter on failure。如果您处理的是引用,它应该只抛出一个异常(bad\u cast
)(在正常情况下不应该为null,即使在技术上是可能的)。