将派生对象作为参数传递[关闭]
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);
【讨论】:
以上是关于将派生对象作为参数传递[关闭]的主要内容,如果未能解决你的问题,请参考以下文章