首页 > 解决方案 > C++ 将派生类列表转换为多态指针列表

问题描述

考虑以下代码:

class Base {
  virtual bool someFunc() = 0;
  virtual ~Base() = default;
};


class Derived1 : public Base {
  bool someFunc() override { ... }
};


class Derived2 : public Base {
  bool someFunc() override { ... }
};


class MyClass {
public:
  MyClass(std::vector<Base> derivedClasses) {
    for (const auto dClass : derivedClasses) {
      m_derivedClasses.emplace_back(std::make_shared<???>(dClass));
    }
  }

  std::vector<std::shared_ptr<Base>> m_derivedClasses;
};


int main() {
  std::vector<Base> listOfDerivedClasses = {Derived1(), Derived2()};
  MyClass mClass(listOfDerivedClasses)
  
  for (const auto dClass : m_derivedClasses) {
    dClass.someFunc();
  }
}

本质上,我有一个类,它在其构造函数中给出了派生类列表,我想将其转换为指向这些派生类的指针列表,以便我可以someFunc()main(). 我似乎无法弄清楚如何让它工作,我需要一些模板魔法吗?

编辑:我可以让MyClass构造函数采用 astd::vector<Base*>并可能让事情像那样工作,但它需要消费者自己创建指针,我希望能保护它们免受这种影响。在我工作的另一个类中,我想要多态行为,我能够使用模板实现这样的目标:

template <typename derivedTypeT, std::enable_if_t<std::is_base_of_v<Base, derivedTypeT>, bool> = true>
MyOtherClass(const derivedTypeT &dClass) : m_dClass(std::make_shared<derivedTypeT>(dClass)) {}

我不知道如果输入是一个,我怎么能做到这一点std::vector,因为它显然可以有多个派生类型。这是我可以用可变参数模板做的事情吗?

标签: c++pointersinheritancepolymorphismderived

解决方案


推荐阅读