【发布时间】:2019-01-15 10:11:47
【问题描述】:
继续我之前的问题: How to return derived type?
我有一个 Validator 类和从它派生的类;当我尝试 返回指向派生类的指针,然后方法返回基 类(验证器)而不是派生。
我将我的班级修改为下一个:
class Validator
{
public:
std::string m_name = "BaseValidator";
static const std::map<std::string, Validator *> validators();
void validateModel(Model &model, const std::vector<std::string> &attrNames);
static Validator *getByName(std::string &name);
virtual void validateAttribute(Model &model, const std::string &attribute);
virtual ~Validator();
virtual std::string name() const;
};
const std::map<std::string, Validator*> Validator::validators()
{
std::map<std::string, Validator*> result;
result["required"] = new RequiredValidator();
return result;
}
void Validator::validateModel(Model &model, const std::vector<std::string> &attrNames)
{
validateAttribute(model, name.at(0));
}
Validator* Validator::getByName(std::string &name)
{
auto g_validators = Validator::validators();
auto validator = g_validators.find(name);
if(validator != g_validators.end()){
return validator->second;
}else{
std::cerr << "Unknow type of validator: " << name << std::endl;
}
return nullptr;
}
void Validator::validateAttribute(Model &model, const std::string &attribute)
{
(void)model;
(void)attribute;
std::cout << this->name() << std::endl;
}
//------------------
class RequiredValidator : public Validator
{
public:
std::string m_name = "RequiredValidator";
void validateAttribute(Model &model, std::string &attribute);
~RequiredValidator();
std::string name() const;
};
std::string RequiredValidator::name() const
{
return m_name;
}
void RequiredValidator::validateAttribute(Model &model, std::string &attribute)
{
(void) model;
(void) attribute;
std::cout << "RequiredValidator!!!" << std::endl;
}
RequiredValidator::~RequiredValidator()
{
}
//------------------
auto validator = Validator::getByName("required");
validator->name();// will output RequiredValidator
//next i'm calling
validator->validateModel(); // whos calling validateAttribute() inside
//and it's output Validator::validateAttribute() //but i wan't
//RequiredValidator::validateAttribute();
//where i was wrong with logic???
我想要的相同的虚拟方法 name() 工作,但是 validateAttribute() 仅从基类调用。
【问题讨论】:
标签: c++ polymorphism