我有一个 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";
};
最佳答案
它返回一个派生实例,但自 validator
是 Validator*
,您正在查看 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/