的动机

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

//Header file
class StringListModel : public QAbstractListModel

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

用下面的解释。



我这样解释他们的答案:

您可以在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"关系,通常被认为是一种好习惯,因为它保持了接口(interface)和实现之间的区别(理想情况下,一个不应影响另一个的设计)。 但是,尝试通过(适当强制转换的)父指针访问纯子功能是可疑的 Realm ,因为它破坏了该接口(interface)实现的区别。不过在极少数情况下这是必要的。
  • 关于c++ - 在指向父对象的指针上初始化子对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19682402/

    10-11 22:42
    查看更多