【问题标题】:Passing Derived Objects as Argument [closed]将派生对象作为参数传递[关闭]
【发布时间】:2020-10-29 19:13:44
【问题描述】:

我有一个这样的 Student 类的构造函数:

Student(ISubject subject, IStudy study);

ISubject 和 IStudy 是抽象类。然后我创建了从抽象类继承的类。 (例如数学:ISubject 和微积分:IStudy)

当我想将派生类的对象传递给构造函数时,我得到一个错误。我该如何解决?

提前致谢。

【问题讨论】:

  • 要获得多态行为,您需要pass by reference。如果你不这样做,you get object slicing.
  • 当你声明构造函数时你应该已经得到一个错误,因为当ISubect 是抽象的你不能有那个类型的实例。无论如何,请包括minimal reproducible example 和编译器错误
  • 当我想将派生类的对象传递给构造函数时,出现错误。我该如何解决这个问题? -- 如果 C++ 书籍或资料没有说明如何做到这一点的示例,请获取新的书籍或资料。传递对象以调用多态行为是 C++ 的基础。

标签: c++ inheritance constructor strategy-pattern


【解决方案1】:

如果您的 ISubject 和 IStudy 类是抽象类,则您不能根据语言规则创建这些类型的对象。但是当你写

(ISubject 学科,IStudy 研究)

它告诉您希望将这些类型的对象作为函数参数传递,但这是不可能的,因为这些对象不存在。

也许你应该做的就是写

(ISubject* 学科,IStudy* 研究)

在函数声明中,这意味着您不希望将对象本身,而是将指向此类型对象的指针传递给函数。一方面,它不会告诉您要传递先验不存在的对象;从另一方面来说,它可以使用指针将派生类的对象传递给该函数,因为派生类的指针可以隐式转换为基类的指针.

【讨论】:

    【解决方案2】:

    Student(const ISubject& subject, const IStudy& study); 应该可以正常工作,如果需要,您可以丢失 const,或者也可以使用 Student(ISubject* subject, IStudy* study);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多