C++ 在指向父对象的指针上初始化子对象

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。这允许我们使用模型的抽象接口,并确保代码仍然有效,即使我们

安静的动机

我正在学习一个在Qt中使用模型的教程。 该示例显示以下代码:

//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,即使在技术上是可能的)。