Почему код явно Apple (const char * name): Fruits (& _ name) работает, когда функция построения Fruits определена как явная Fruits (std :: string * f_n): f_name_ (f_n) (или когда указатели в этих кодах заменены ссылками)?
Вы передаете адрес переменной-члена _name
, которая имеет тип std::string
, поэтому она хорошо компилируется и explicit
не имеет к этому отношения. Обратите внимание, что вы играете в очень опасную игру здесь, если вы попытаетесь разыменовать этот указатель внутри конструктора Fruits
, вы получите UB.
Распределяются ли переменные-члены производного класса после или перед переменными-членами своего базового класса?
Ваш вопрос показывает, что вы не понимаете, как это работает. Производный класс - это объект, который находится в sizeof(typename)
памяти, которая включает базовый объект и все переменные-члены, добавляемые производными, если таковые имеются. Когда память выделяется для него, она выделяется сразу для всего объекта, а не по частям. Другая проблема - порядок инициализации - хотя выделенная память объектов инициализируется от базового к производному, поэтому, если вы попытаетесь получить доступ к объектам производного класса в конструкторе базового класса, вы получите UB, как если бы вы попытались получить доступ к неинициализированному объекту.