【问题标题】:c++: how to define function that accpets all the sub-class of a speciic classc ++:如何定义接受特定类的所有子类的函数
【发布时间】: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。通过在 stackoverflow 上提问来学习该语言可能太复杂了。

标签: c++ inheritance


【解决方案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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 2015-01-21
    • 2015-03-28
    • 2020-01-14
    • 1970-01-01
    • 2021-02-14
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多