将派生对象作为参数传递[关闭]

Posted

技术标签:

【中文标题】将派生对象作为参数传递[关闭]【英文标题】: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++ 的基础。 【参考方案1】:

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

(ISubject 学科,IStudy 研究)

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

也许你应该做的就是写

(ISubject* 学科,IStudy* 研究)

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于将派生对象作为参数传递[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能将运算符作为参数传递? [关闭]

是否可以通过引用以基类作为参数的函数来传递派生类

给定一个基类作为参数,如果传递了派生类,我如何使用 op<< 重载来打印派生类的特征?

将私有父类类型作为参数传递 (C2247)

Javascript - 将函数作为参数传递

无法将对象作为参数传递