我有一个关于基类和派生类的C++设计问题。
代码如下:

class BaseClass:
{
  public:
     BaseClass();
     virtual ~BaseClass();
     //...Some basic functions for the derived Classes
     void write_data(void* data);
};

class DerivedClass1 : BaseClass
{
  public:
     DerivedClass1(){}
     ~DerivedClass1() override{}
     void method(Type1 data);
}

class DerivedClass2 : BaseClass
{
  public:
     DerivedClass2(){}
     ~DerivedClass2() override{}
     void method(Type2 data);
}
// There are hundreds of auto-created derived classes
.....
实例化派生类的类使用 vector 存储实例化派生类:
std::vector<std::unique_ptr<BaseClass>> m_factory_vector;
存储类的函数是:
template<typname Type>
void fun(Type& data)
{
   std::unique_ptr<BaseClass> base= std::make_unique<Type>(*file_);
   base.get()->method(data);
   m_factory_vector.push_back(base);
}
使用模板的原因是由于调用fun的函数数量所致。
现在,我想遍历 vector 并再次在派生类中调用该方法。因为这些方法通过将数据收集到缓冲区中(大小为100,但总大小未知)将不同类型的数据写入HDF5文件,但是在收集的批处理中有一些数据我想在刷新时进行刷新程序结束。这是我遇到的问题,但愿我可以这样做:
for(hsize_t i=0;i<m_factory_vector.size();i++)
{
   m_factory_vector[i]->method({});
}
但是我知道问题在于方法不是在BaseClass中,而是在派生类中。但是派生类中的方法具有不同类型的输入参数,我可能无法在BaseClass中声明virtual void method()。但是,我仍然希望有这样的东西,以便可以调用将这些数据刷新到数据库中而不会丢失数据。

最佳答案

在不重新设计的情况下,您可以使用dynamic_cast:

for (hsize_t i=0;i<m_factory_vector.size();i++)
{
   if (auto* p = dynamic_cast<DerivedClass1>(m_factory_vector[i]->get()))
       p->method({});
   else if (auto* p = dynamic_cast<DerivedClass2>(m_factory_vector[i]->get()))
       p->method({});
   // ...
}

关于c++ - 通过迭代基类 vector 在派生类中实现的调用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64893794/

10-12 20:48