You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何定义可接收指定类所有子类对象的函数

完全可以实现,这正是面向对象多态特性的典型适用场景,不需要每次新增迷宫子类就重写solve_maze函数,按以下步骤修改即可:

修改要点

  • 给solve_maze新增Maze类型的入参,必须用基类的引用或指针,禁止直接用Maze值传递:值传递会触发「对象切片」,只会保留基类部分的成员,调用的永远是基类的is_obstacle_free方法,无法触发多态。
  • 给Maze基类添加虚析构函数:避免后续通过基类指针/引用管理子类对象时,出现内存泄漏或未定义行为。
  • 要求所有自定义迷宫类必须以public方式继承Maze(这也是功能扩展类继承的标准写法)。

修改后的完整代码示例如下:

#include <memory>

class Maze
{
public:
   // 虚析构函数,保证子类对象释放时行为正确
   virtual ~Maze() = default;
   // 建议加const修饰,因为判断障碍物不会修改迷宫对象状态
   virtual bool is_obstacle_free(Point p) const {
       return true;
   }
};

class CustomMaze : public Maze
{
public:
  bool is_obstacle_free(Point p) const override;
};

// 更深层级的子类也无需修改solve_maze
class CustomMaze2 : public CustomMaze
{
public:
  bool is_obstacle_free(Point p) const override;
};

// 新增const Maze&类型参数,可接收所有public继承自Maze的子类对象
void solve_maze(const Maze& maze, Space s, Solution& sol){
   // 内部调用is_obstacle_free时,会自动绑定到实际传入对象对应的实现版本
   // 不管是Maze、CustomMaze还是CustomMaze2都可以正常工作
}

调用示例

// 使用自定义迷宫子类,直接传入即可
CustomMaze2 my_maze;
Solution sol;
Space s;
solve_maze(my_maze, s, sol);

如果需要在solve_maze内部存储迷宫对象供后续异步使用,可以把参数类型换成std::shared_ptr<const Maze>或std::unique_ptr<const Maze>,同样支持所有Maze子类传入。

内容的提问来源于stack exchange,提问作者HiroIshida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 21:06:04