【发布时间】:2021-06-03 16:32:03
【问题描述】:
让我用A < B写出A是B的子类的关系。假设三个类之间存在关系A < B < C。
现在,我想做的是定义一个函数/类方法,它可以接受所有A、B 和C(A 的所有子类)的参数。是否可以?如果是这样,我该怎么做?
编辑:动机
这样做的动机如下:
假设我想解决一个迷宫。求解器函数solve_maze 采用Maze 并求解迷宫。默认情况下,is_obstacle_free 设置为始终返回 true。这意味着默认迷宫是空白区域。
我想做的是,如果用户愿意,可以通过继承 Maze 类来定义他们的自定义 CustomMaze。用户可以通过调整is_obstacle_free 函数来改变迷宫的形状。也许,另一个用户想要定义类 CustomMaze2 继承自 CustomMaze。
如果我可以定义接受Maze 的任何子类型的solve_maze 函数,我们就可以避免在用户添加新迷宫类型时定义solve_maze。
class Maze
{
virtual bool is_obstacle_free(Point p){
return true;
}
};
class CustomMaze : public Maze
{
bool is_obstacle_free(Point p) override;
};
void solve_maze(Space s, Solution& sol){
\\ call a lot of is_obstacle_free inside
}
【问题讨论】:
-
您的参数必须是引用或指针。但是,您仍然只能访问用作参数的该类类型的成员。
-
这能回答你的问题吗? What is object slicing?
-
TL;DR 版本:它们还没有被投射。
sample按值获取A,因此它将给定参数复制到a并且由于a不能包含B或C但两者都可以隐式转换为A,a是忽略任何B- 或 C`-ness 的新对象。 -
更改
void sample(A a);->void sample(A & a); -
如果您想学习 C++,我建议您联系good book。通过在 stackoverflow 上提问来学习该语言可能太复杂了。
标签: c++ inheritance