如何返回派生类型? [英] How to return derived type?
问题描述
我有一个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";
};
推荐答案
它正在返回派生实例,但是由于validator
是Validator*
,因此您正在查看Validator
的m_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屋!