是否可以使用从基类非虚拟方法派生的类虚拟方法?

时间:2020-06-30 16:35:35

标签: c++ oop gcc polymorphism c++14

我有多个派生类,这些派生类扩展了同一基类。它们具有相同的属性,但单个方法可能具有不同的参数和主体。我如何拥有std :: unique_ptr并为派生类调用方法?

这是我到目前为止所知道的:

  1. 功能模板不能为virtual;
  2. 不能用其他签名覆盖纯虚函数;
  3. 函数指针将需要知道所有可能的派生函数的参数列表

这是我目前倾向于的方向(没有成功):

基类:

class IBase
{
  /** ... **/
  template <class T, typename ...Args>
  MyCustomType perform(T &obj, Args ... args)
  {
    std::bind(obj->run, args);
  }

  virtual MyCustomType run(...) = 0;
};

派生类:

class Derived : IBase
{
  /** ... **/
  virtual MyCustomType run(MyType1 a, MyType2 b, bool c) override
  {
    /* code */
  }
};

我想使用指向基类的指针,调用basePtr->perform(a, b, c)和子类Derived中的方法来执行。有道理吗?

2 个答案:

答案 0 :(得分:0)

除了可能具有不同参数和正文的单个方法之外

这不是C ++允许您直接执行的操作。 C ++是一种静态类型的语言。函数的调用者和被调用者必须在传递的内容和返回的内容上静态达成一致。期间。

您要做的唯一选择是采用静态类型擦除,例如std::any或类似技术(例如将数据隐藏在void*后面,但这非常危险)。也就是说,您可以通过tuple中存储的值的any将“参数”传递给函数。而且返回值也可以是any

但是,发送代码必须确切地知道接收代码所期望的内容,反之亦然;您不能在不确切知道您期望在那里的情况下打开any的包装。因此,该接口是通用的,但是接收方和发送方仍然必须就到底发生了什么达成共识。

您绝对不希望接收函数一遍又一遍地尝试一堆不同的转换,以弄清提供了哪些参数集以及因此要调用的函数体。

从广义上讲,由于错误和错误的可能性很高,因此应尽可能避免使用此类接口。

答案 1 :(得分:-3)

我认为我可以使用Variadic Function Templates来解决最初的想法。

class IBase
{
  template <typename ... Args>
  MyType run(Args... as)
  {
    MyType result;
    return result;
  }
};

然后我可以在Derived中重载此方法:

class Derived : IBase
{
  /** ... **/
  MyType run(const MyOtherType &X, const int &a);
};

有人能想到此解决方案有问题吗?

相关问题