【问题标题】:Is it possible to use constructors with different parameters in inherited classes?是否可以在继承的类中使用具有不同参数的构造函数?
【发布时间】:2020-06-23 09:41:35
【问题描述】:

有没有办法在 C++ 中覆盖返回具有不同构造函数的模板化实体的函数?

template<T> class A {
  virtual shared_ptr<T> createEntity (a)
     return make_shared<T>(a);
}

class E
{
  int a,b;
  E (int x, int y) : a(x), b(y);
}

class B : public A<E> {
  int b;
  shared_ptr<E> createEntity (a) override 
     return make_shared<E>(a,b);
}

大多数实体的标准构造函数只需要一个变量,而其他类的实体需要构造多个变量。不用条件编译能做到吗?

编辑:其他实体只用一个变量“a”实现它们的构造函数,所以我基本上想在大多数情况下使用 A::createEntity (a) 而在特殊情况下想使用 B::createEntitiy。

【问题讨论】:

  • 您希望::createEntity::B::createEntity 遮蔽或覆盖?我理解正确吗?
  • 如何通过基类指针调用这个被覆盖的函数?如果你不这样做,那么继承和虚函数就是不适合这项工作的工具。
  • 您可以使方法纯虚拟。然后完全由派生类以它选择的任何方式创建 T 。如所写,模板类 A 必须致力于构造 T,这意味着所有可能的 T 必须以 A 可以构造它的方式编写。
  • 我猜他希望 'b' 参数被丢弃,以防 E 构造函数只有一个参数。
  • @YSC 是的,我基本上想隐藏函数

标签: c++ inheritance constructor overriding virtual


【解决方案1】:

这很容易实现(甚至不需要条件编译)。

您需要做的就是发明某种形式的参数结构,然后将所有参数放入其中。

类似:

struct InitInfo {
  int x_;
  int y_;//may not always be used..
};

然后和E一起使用:

class E
{
  int a,b;
  public:
  E (InitInfo info) : a(info.x_), b(info.y_) {
  }
};

并像这样使用:

return make_shared<E>(InitInfo{a,b});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2021-01-26
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多