Вы объявили две переменные-члены с именем m_name
, одну в Validator
и одну в RequiredValidator
. За исключением одного и того же имени, эти две переменные совершенно не связаны. Ваш компилятор, вероятно, напечатает предупреждение о втором слежении за первым.
К какой переменной вы обращаетесь, зависит от типа переменной, к которой вы обращаетесь.
Например:
RequiredValidator r;
std::cout << r.m_name << "\n"; // prints "RequiredValidator"
Validator* v = &r;
std::cout << v->m_name << "\n"; // prints "BaseValidator"
std::cout << dynamic_cast<RequiredValidator*>(v)->m_name << "\n"; // prints "RequiredValidator"
Есть несколько решений для этого. Первый - просто установить значение переменной BaseValidator
в конструкторе RequiredValidator:
class Validator
{
public:
std::string m_name;
Validator( const std::string& name = "BaseValidator" )
:m_name( name )
{
}
};
class RequiredValidator : public Valdiator
{
public:
RequiredValidator()
: Validator("RequiredValidator")
{}
};
Более обычное решение - использовать вместо этого виртуальный метод:
class Validator
{
public:
virtual std::string getName() { return "BaseValidator"; }
};
class RequiredValidator : public Valdiator
{
public:
virtual std::string getName() override { return "RequiredValidator"; }
};