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
相关产品推荐
相关产品推荐

