【发布时间】:2019-11-23 19:12:50
【问题描述】:
我目前有一个基类Env,它是一个接口,我有几个派生类。
class Env
{
public:
//method in question
virtual std::tuple<Eigen::VectorXf,float,bool,std::string> step(const //what goes here?//)=0;
virtual ~Env(); //virtual destructor
};
一个示例派生类如下(头)
class MountainCar: public Env
{
public:
MountainCar();
std::tuple<VectorXf,float,bool,std::string> step(const int) override;
};
现在,设计是所有环境都必须从 Env 继承。但是,我想强制所有环境实现 step() 方法,这就是为什么基础 Env 中的 step 方法是纯虚拟的。
但是,每个派生的 Env 可以在 step 方法中采用不同的参数类型,这应该是一个有效的覆盖(这些有效类型来自一个固定的、已知的集合)例如,mountain car 用一个 int 参数定义它。另一个环境 CartPole 将 VectorXf 作为 step 参数。
一开始,我把基类做成了一个带参数U的模板类,并将U传递给step方法。然后,派生类用于继承自模板实例化,例如 MountainCar 继承自 Env。但是,问题是所有派生类都继承自基类的不同实例化,我不能再使用公共基指针来实现多态性。
如何设计这个具有 C++11 特性的系统?
【问题讨论】:
-
你怎么能用这个?如果另一个类有一个
std::string作为该方法的参数,你将如何使用基指针调用 step 函数? -
由于该类也继承自基类,并且 step 方法是虚拟的,所以我可以调用它。问题是如何使这成为可能(确保派生类覆盖至少采用一种参数类型的 step 方法)
-
想多了。
base->step(something);在您的代码中。你可以传递什么类型的something,如果 base 可以指向一个需要 int 的环境,或者需要一个字符串的东西? -
我不明白你的意思。我的基本指针是 Env* MountainCar。然后,我会做 Env->step(1)。
-
如果你知道最衍生的类型 - 当然。但是,您不需要虚函数,只需使用该派生类型即可。当你收到和
Env*作为函数参数时你会怎么做。
标签: c++ c++11 inheritance polymorphism system-design