Чтобы получить доступ к элементу метода производного класса через указатель (или ссылку) на его базовый класс, вы должны использовать полиморфизм (чего вы не делали).Например,
struct Base {
virtual string name() const { return "Base"; }
};
struct Derived : Base {
string name() const override { return "Derived"; }
};
const Base*ptr = new Derived;
assert(ptr->name()=="Derived");
Такой полиморфизм работает только с нестатическими методами-членами , но не с элементами данных или статическими функциями-членами.В вашем случае полиморфизма нет и, следовательно, Base::name
остается, ну, в общем, Base::name
.
В вашем конкретном случае, тем не менее, есть два других возможных решения.Во-первых, вы можете использовать RTTI, хотя это, как правило, осуждается.Другой вариант - сохранить name
как элемент данных в Base
и передать его при построении:
struct Base {
const string name = "Base";
Base() = default;
protected:
Base(string const&n)
: name(n) {}
};
struct Derived : Base {
Derived()
: Base("Derived") {}
};
const Base*ptr = new Derived;
assert(ptr->name=="Derived");
, когда нет полиморфизма (и, следовательно, нет виртуальной таблицыи дополнительная косвенность), но за счет члена данных name
.