c ++:如何定义接受特定类的所有子类的函数
Posted
技术标签:
【中文标题】c ++:如何定义接受特定类的所有子类的函数【英文标题】:c++: how to define function that accpets all the sub-class of a speciic class 【发布时间】: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。通过在 *** 上提问来学习该语言可能太复杂了。
【参考方案1】:
void sample(A& a);
将接受从A
派生的任何内容,但sample
将只使用a
,就好像它是A
对象一样(不进行强制转换)。
使用模板,您可以在不强制转换的情况下做到这一点:
template <typename T>
void sample(T& t)
static_assert(std::is_base_of<A,T>::value, "T must be derived from A");
// T is whatever sample was called with.
【讨论】:
以上是关于c ++:如何定义接受特定类的所有子类的函数的主要内容,如果未能解决你的问题,请参考以下文章