【发布时间】:2021-03-01 18:19:17
【问题描述】:
我有一个关于基类和派生类的 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
.....
实例化派生类的类使用向量来存储实例化的派生类:
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的函数数量未知。
现在我想遍历向量并再次调用派生类中的方法。因为这些方法通过收集缓冲区中的数据(大小为 100,但总大小未知)将不同类型的数据写入 HDF5 文件,但是收集的批处理中剩余一些数据,我想在程序结束。这是我遇到的问题,我希望我可以这样做:
for(hsize_t i=0;i<m_factory_vector.size();i++)
{
m_factory_vector[i]->method({});
}
但我知道问题是方法不在 BaseClass 中,而是在派生类中。但是派生类中的方法有不同类型的输入参数,我可能无法在 BaseClass 中声明virtual void method()。但是,我仍然想要这样的东西,这样我就可以调用将这些数据刷新到数据库中而不会丢失数据。
【问题讨论】:
-
虽然不方便,但名为
flush的虚拟方法似乎是最直接的方法...
标签: c++ polymorphism