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写出AB的子类的关系。假设三个类之间存在关系A < B < C

现在,我想做的是定义一个函数/类方法,它可以接受所有ABCA 的所有子类)的参数。是否可以?如果是这样,我该怎么做?

编辑:动机 这样做的动机如下: 假设我想解决一个迷宫。求解器函数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 不能包含 BC 但两者都可以隐式转换为 Aa 是忽略任何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 ++:如何定义接受特定类的所有子类的函数的主要内容,如果未能解决你的问题,请参考以下文章

构造函数继承问题c

C 函数和作用域

在C语言中怎样定义一个函数为“distance”?

C语言基础:函数(定义函数声明函数调用函数(传值调用 / 引用调用)函数的参数(形参 / 实参))

C++--继承中的构造与析构父子间的冲突

C ++将指向子函数的指针传递回父类