c++ - 如何返回派生类型?

标签 c++ polymorphism

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

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* ,您正在查看 m_name Validator的成员,不是 RequiredValidator 之一.
(尽管名称相同,但它们是不同的变量。不存在“虚拟变量”。)

有几个选项;

  • 您可以拥有一个虚拟 getName函数并在每个子类中重写它。

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

示例:

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

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

关于c++ - 如何返回派生类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54194395/

相关文章:

c++ - 检查 OSX 是否采用 24 小时制

用于隐藏类型特定实现的 Java 泛型?

java - 将一种类型的对象声明为另一种类型的实例有什么好处?

c++多重继承和显式构造函数调用

c++ - 在构造函数初始化列表上 move shared_ptr

c++ - 试图调用模板类的友元函数

c++ - 是否返回无效的有效代码?

java - JAX-RPC Web 服务中的多态性

java - 泛型父类作为列表中的多态变量

Objective-C 类别