如何返回派生类型? [英] How to return derived type?

查看:123
本文介绍了如何返回派生类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Validator类和从其派生的类; 当我尝试返回指向派生类的指针时,方法将返回基类(Validator)而不是派生类.

I have a Validator class and derived classes from it; When i'm trying to return pointer to derived class then method return base class(Validator) instead of Derived.

class Validator
{
public:
    std::string m_name = "BaseValidator";

    static const std::map<std::string, Validator *> validators();

    static Validator *getByName(std::string &name);
};


const std::map<std::string, Validator*> Validator::validators()
{
    std::map<std::string, Validator*> result;
    //RequiredValidator is derived
    result["required"] = new RequiredValidator();
    return result;
}

Validator* Validator::getByName(std::string &name)
{
    auto g_validators = Validator::validators();
    auto validator = g_validators.find(name);
    if(validator != g_validators.end()){
        std::cout << "getByName: " << validator->second->m_name << std::endl;
        return validator->second;
    }else{
        std::cerr << "Unknow type of validator: " << name << std::endl;
    }
    return nullptr;
}

//output BaseValidator but i need RequiredValidator


class RequiredValidator : public Validator
{
public:
    std::string m_name = "RequiredValidator";
};

推荐答案

它正在返回派生实例,但是由于validatorValidator*,因此您正在查看Validatorm_name成员,不是RequiredValidator之一.
(尽管名称相同,但它们是不同的变量.没有虚拟变量".)

It is returning a derived instance, but since validator is a Validator*, you're looking at the m_name member of Validator, not the one of RequiredValidator.
(Despite having the same name, they are distinct variables. There are no "virtual variables".)

有两种选择;

  • 您可以拥有一个虚拟的getName函数,并在每个子类中覆盖它.

  • You can have a virtual getName function and override it in every subclass.

在派生类中设置 base m_name,例如,通过将该名称作为基本构造函数的参数.

Set the base m_name in derived classes, for instance by making the name a parameter of the base constructor.

示例:

class Validator
{
public:
    Validator(const std::string& name = "BaseValidator") : m_name(name) {};
    // ...
};

class RequiredValidator : public Validator
{
public:
    RequiredValidator() : Validator("RequiredValidator") {}
    // ...
};

这篇关于如何返回派生类型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆