C ++ не работает как Python (что неудивительно, ведь это два очень разных языка), а переменные-члены, определенные в унаследованном классе, действительно определяют новую переменную, которая не связана с переменными родительский класс.
Одним из возможных решений является создание второго (возможно защищенного) конструктора Base
, который принимает name
в качестве аргумента, а затем класс Derived
может использовать его для инициализации члена:
struct Base {
Base() = default; // A defaulted default constructor
std::string name = "base";
void announce() {
std::cout << name << std::endl;
}
protected:
explicit Base(std::string name)
: name{ std::move(name) } // Initialize the member
{
}
};
struct Derived : public Base {
Derived()
: Base("movie") // Initialize the base class using the special constructor
{
}
};
Требуется конструктор по умолчанию Base
, так как если вы объявите другой конструктор, компилятор не будет автоматически генерировать конструктор по умолчанию для вас.