c++ - 如何有条件地实例化不同的父/子类?

标签 c++ class oop inheritance

类似问题已发布并已回答herehere但建议的解决方案对我不起作用。

我有三个具有多级继承的类:

class Model
{
public:
    Model();
    template <typename InputModelType>
    void importModel(const InputModelType &m);
    virtual void process(); 
};

class SpecialModel : public Model
{
public:
    SpecialModel();
    template <typename InputModelType>
    void importSpecialModel(const InputModelType &m);
    virtual void process() override; 
};

class SpecialSpecialModel : public SpecialModel
{
public:
    SpecialModel();
    template <typename InputModelType>
    void importSpecialSpecialModel(const InputModelType &m);
    virtual void process() override; 
};

子模型是父模型的特例,可以存储在更简单的结构中,因此可以更快地处理。

我想做的是根据用户指定的输入参数 model_type 实例化模型,如下所示:

Model* model;
switch(model_type){
case 1:
    model = new SpecialModel;
    model->importSpecialModel(gm);
    break;
case 2:
    model = new SpecialSpecialModel;
    model->importSpecialSpecialModel(gm);
    break;
default:
    model = new Model;
    model->importModel(gm);
    break;
}

model->process();

使用上面的代码,我得到了以下错误:

‘class Model’ has no member named ‘importSpecialModel’

‘class Model’ has no member named ‘importSpecialSpecialModel’

问题在于,导入函数是模板化的,因此在基类中将它们定义为虚函数然后在子类中覆盖是无效的。

最佳答案

您只能使用对象静态类型的函数。 您可以使用派生类型执行以下操作。

std::unique_ptr<Model> CreateModel(int model_type, const InputModelType &m)
{
    switch(model_type)
    {
        case 1:
        {
            auto model = std::make_unique<PairwiseMRF>();
            model->importSpecialModel(gm);
            return model; // or std::move(model)
        }
        case 2:
        {
            auto model = std::make_unique<PairwiseMetricMRF>();
            model->importSpecialSpecialModel(gm);
            return model; // or std::move(model)
        }
        default:
        {
            auto model = std::make_unique<Model>();
            model->importModel(gm);
            return model;
        }
    }
}

然后

auto model = CreateModel(model_type, gm);
model->process();

关于c++ - 如何有条件地实例化不同的父/子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43942657/

相关文章:

c++ - 对非常量的引用的初始值必须是左值,通过引用错误传递对象类型

c# - 类 : Property Attributes

c++ - 使用 sntp(windows c++) 从服务器获取时间/日期

python - 在 Python 类中编写 __init__ 方法的文档字符串的首选位置在哪里?

c++ - 结构化对象的高性能装饰器模式

Java TextToSpeech 无法找到或加载主类模型。Main

python - pyqt GUI编程中如何组织类

java - 如果 OOP 为空,如何设置位置

c++ - C++ 中 char* 类型的变量

c++ - 模板特化中的双模板<>