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

标签 c++ qt pointers polymorphism

提问的动机

我正在学习 Model-View (paragraph Using a model) 的教程在 Qt 中使用模型。 该示例显示以下代码:

//Header file
class StringListModel : public QAbstractListModel

//main.cpp
QAbstractItemModel *model = new StringListModel(numbers);

附有以下解释。

Note that the StringListModel is declared as a QAbstractItemModel. This allows us to use the abstract interface to the model, and ensures that the code still works, even if we replace the string list model with a different model.

我是这样解读他们的回答的:

您可以在 model 上开发您的项目,如果您需要更改底层数据结构,您只需这样做:

//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()
  • 这是一种不好的做法吗?如果不是,为什么不呢?

最佳答案

  • 是的,这是一个隐式向上转换(即在继承层次结构中向上,从子级到父级)。这与显式转换不同,在显式转换中,您可以准确指定期望的输出类型;它也不同于向下转型,向下转型是从父到子的继承层次结构。

  • 是的,子类中的新方法/成员有点问题。它们不能通过父类指针直接访问。但是,您可以使用 dynamic_cast<>()尝试将父指针转换为您期望的任何子类,并以这种方式访问​​新功能。但这不是理想的方法。你最好重构父/子类并使用 virtual功能来避免这种情况。

  • 一般来说,存储和使用父类指针并不是坏习惯。事实上,如果您的类层次结构实现“is-a”关系,通常被认为是一种好的做法,因为它保持了接口(interface)和实现之间的区别(理想情况下,一个不应该影响另一个的设计)。 但是,尝试通过(适当转换的)父指针访问仅限子级的功能是一个可疑的领域,因为它打破了接口(interface)实现的区别。不过在极少数情况下是必要的。

关于c++ - 在指向父对象的指针上初始化子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682402/

相关文章:

c++在谷歌浏览器中启用可访问性检查

c++ - 如何使用其中一个键搜索具有多个键的 map ?

c++ - 如何将模板参数限制为模板化接口(interface)特化的后代?

c++ - 如何降低(非传统的)基于Qt5/QML的软件的内存使用率?

c++ - 实现 OpenSceneGraph 时在 Qt 中获取引用问题

c - C 中的函数和数组

c++ - visual studio 2013 发布编译不打开文件

c++ - QTableView 如何判断 Row 是否被选中?

c - 在这些声明下,以下表达式是什么类型,它们是否正确?

c++ - 成员函数指针的静态成员数组