您可以将子类作为参数传递给具有超类参数的函数吗? C++

Posted

技术标签:

【中文标题】您可以将子类作为参数传递给具有超类参数的函数吗? C++【英文标题】:Can you pass a subclass as an argument to a function with a superclass parameter? C++ 【发布时间】:2013-06-16 21:45:24 【问题描述】:

我正在构建一个小 C++ 游戏(使用 SFML,但这在大多数情况下无关紧要),并且我正在更改一些代码以使其更可重用。我想创建一个方法来移动存储在数组中的一堆形状。

假设我们有一个名为 Shape 的类,以及另一个名为 Rectangle 的子类。我希望该功能适用​​于 any 形状。这可能吗?我想我可以像您在下面看到的那样做一些事情,但是除非我将第一个参数更改为采用 Rectangles 数组,否则它会使游戏崩溃。

void shift_shapes(Shape *shapes, int num_shapes, int x_offset, int y_offset)

    for (int i = 0; i < num_shapes; i++)
        shapes[i].move(x_offset, y_offset);


Rectangle rects[100];
// *Add 100 rectangles*
shift_shapes(rects, 100, 10, 5);

感谢您的帮助!

【问题讨论】:

parashift.com/c++-faq-lite/array-derived-vs-base.html 【参考方案1】:

数组不包含多态性,您可以使用指针向量将其归档并将对向量的引用传递给函数。比如:

#include <memory>
#include <vector>

void shift_shapes(std::vector<std::unique_ptr<Shape> >& shapes, int num_shapes, int x_offset, int y_offset)

    for (int i = 0; i < num_shapes; i++)
    
        shapes[i].move(x_offset, y_offset);
    

【讨论】:

在这种情况下,为不同类型的形状简单地创建单独的函数实际上会更好(更实用和可读)吗?我觉得这是一个常见的 OOP 问题,而且我认为你必须跳过铁环才能做到这一点很奇怪。 你不需要分离函数,一个模板函数就可以完美地工作。 @billz std::vector&lt;std::unique_ptr&lt;Shape&gt; &gt; 与仅使用 std::vector&lt;Shape&gt; 相比有什么好处? @kfsone 多态,它允许指针指向派生对象。

以上是关于您可以将子类作为参数传递给具有超类参数的函数吗? C++的主要内容,如果未能解决你的问题,请参考以下文章

我可以将数组作为参数传递给 Java 中具有可变参数的方法吗?

Java:将具有不同类型的参数传递给函数

将参数传递给超类构造函数

我可以将类型作为参数传递给这个函数吗?

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

我可以将数组和变量作为参数传递给 C# 中的方法吗? [复制]