首页 > 解决方案 > 运行相同函数名 C++ 的多个类的列表

问题描述

我有多个具有相同功能的类,如下所示

class A
{
  void display()
  {
    // display something
  }
};

class B
{
  void display()
  {
    // display something two
  }
};

我想将差异类存储在列表或向量中并循环以调用具有相同名称的相同函数

int main()
{
  A * a;

  B * b;

  //list or vector to store object

  std::vector < Something that can store different class > listofclass;

  listofclass.emplace_back(a);

  listofclass.emplace_back(b);

  for (int i = 0; i < listofclass.size(); i++)

  {

    listofclass[i].display();

  }
}

有可能这样做吗?因为有单独的类,具有不同的目的,现在我尝试将它们组合在一起或者有其他替代方法来实现这样的事情

标签: c++

解决方案


如果您控制 and 的定义AB您可以编写一个公共基类,并让它们继承它。

class can_display {
public:
  virtual void display() = 0;
  virtual ~can_display() = default;
};

class A : public can_display 
{
  void display() override
  {
    // display something
  }
};

class B : public can_display 
{
  void display() override
  {
    // display something two
  }
};

int main()
{
  A a;

  B b;

  std::vector<can_display *> displayables;

  displayables.push_back(&a);

  displayables.push_back(&b);

  for (can_display * displayable : displayables)
  {
    displayable->display();
  }
}

作为更改定义AB从公共基础继承的替代方法,您可以拥有一个继承的包装器。

template <typename T>
class can_display_impl {
  T * wrapped;
public:
  can_display_impl(T * wrapped) : wrapped(wrapped) {}
  void display() override { wrapped->display(); }
}

template <typename T>
std::unique_ptr<can_display> make_can_display(T & wrapped) {
  return std::make_unique<can_display_impl<T>>(&wrapped);
}

int main()
{
  A a;

  B b;

  std::vector<std::unique_ptr<can_display>> displayables;

  displayables.emplace_back(make_can_display(a));

  displayables.emplace_back(make_can_display(b));

  for (auto & displayable : displayables)
  {
    displayable->display();
  }
}

推荐阅读