У меня вопрос о неявных и явных вызовах базового конструктора. Если мы имеем иерархию классов, как это:C++ неявный и явный вызов конструктора наследования
class Person{
protected:
std::string m_name;
public:
Person(std::string& _name) : m_name(_name){std::cout << "A person is being constructed." << std::endl;}
};
class Baby : public Person{
private:
int m_no_of_nappies;
public:
Baby(std::string& _name, int& _no_of_nappies) : m_no_of_nappies(_no_of_nappies), Person(_name) {std::cout << "A baby is being constructed." << std::endl ;}
};
По моим конспектам, призыв к «Baby» в главном, например, так:
std::string babyname = "Robert";
int nappies = 5;
Baby baby(babyname, nappies);
Причин следующего случаться:
- в качестве явного вызова лица производится в списке инициализации ребенка: список инициализации младенца получает называется и
no_of_nappies
инициализируется. - Далее выполняется вызов конструктора Person и вызывается список инициализации человека. . Инициализируется
m_name
. - Затем вызывается тело конструктора человека.
- Корпус конструктора младенца, наконец, называется.
Это имеет смысл, однако, что о если бы неявные вызовы, сделанные в конструктор по умолчанию родительского класса, например:
class Vehicle{
protected:
int m_no_wheels;
public:
Vehicle() : m_no_wheels(0) { std::cout << "A vehicle is being constructed." << std::endl; }
};
class Bicycle : public Vehicle{
protected:
bool m_is_locked;
public:
Bicycle() : m_is_locked(false) { std::cout << "A bicycle is being constructed." << std::endl; }
};
Это та часть, что я не так уверен в. Мое предположение, что вызов Bicycle bike;
в основном имеет следующий эффект:
- неявный вызов к конструктору по умолчанию автомобиля от велосипеда. Прежде чем вызывать список инициализации велосипеда.
- Как автомобиль не унаследовать от чего-либо, списка инициализации автомобильного называются, где он инициализирует
m_no_wheels
к0
. - Корпус конструктора транспортного средства называется.
- Вернемся к Bicycle и теперь его список инициализации называется, инициализацией
m_is_locked
кfalse
. - Тело конструктора велосипеда называется.
Не мог бы кто-нибудь объяснить, верно ли мое обоснование скрытого вызова?
Основное отличие, на мой взгляд, состоит в том, что при явной ссылке на базовый конструктор список инициализации дочернего класса всегда попадает первым, чтобы вызвать этот базовый конструктор, однако с неявным вызовом, список инициализации верхнего большинства родителей всегда попадает в первую очередь.
Спасибо, и очень ценим!
Редактировать: Я спрашиваю конкретно, изменился ли заказ, в зависимости от неявного или явного вызова родительского класса.
Это имеет большой смысл. Просто уточнить: означает ли это, что даже если инициализатор и конструктор 'Person' вызывается до запуска' m_no_of_nappies' - список инициализации «Baby» по-прежнему попадает, чтобы вызвать инициатор Person. Итак, 'Baby' называет человека из его списка инициализации, поэтому первое, что попало, это список инициализации« Baby »? –
@MuyiwaOlu Я не уверен, что понимаю ваш вопрос. Я не знаю, что вы подразумеваете под «хитом». Базы и элементы инициализируются в установленном порядке, и во время этой инициализации, если имеется соответствующий mem-инициализатор, он используется для инициализации именованной базы или члена. – Brian
@MuyiwaOlu Если вы не указали конструктор базового класса перед списком инициализации данных производного класса, вы можете получить предупреждение, зависящее от настроек компилятора. – Steephen