我有一个关于基类构造函数的隐式和显式调用的问题。如果我们有这样一个类层次结构:
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);
导致以下情况发生:
- 由于在Baby的初始化列表中进行了对Person的显式调用,因此会调用Baby的初始化列表,并初始化
no_of_nappies
。 - 接下来,会进行对Person构造函数的调用,并调用Person的初始化列表。将初始化
m_name
。 - 然后会调用Person的构造函数体。
- 最后会调用Baby的构造函数体。
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;
具有以下效果:
- 从Bike中向Vehicle的默认构造函数进行了隐式调用。在调用Bike的初始化列表之前。
- 由于vehicle没有继承任何内容,因此调用Vehicle的初始化列表,它将
m_no_wheels
初始化为0
。 - 调用Vehicle的构造函数体。
- 我们回到Bicycle,现在调用其初始化列表,将
m_is_locked
初始化为false
。 - 调用Bike的构造函数体。
请问我的隐式调用推理是否正确?
在我看来,主要区别在于显式引用基础构造函数时,子类的初始化列表总是被首先触发以调用该基础构造函数 - 然而,在隐式调用中,始终会首先触发最顶层父类的初始化列表。
谢谢,并感激不尽!
编辑:我特别询问的是,根据对父类的隐式或显式调用,顺序是否会发生变化。
m_no_of_nappies
之前调用了Person
的初始化程序和构造函数,但仍然会命中Baby
的初始值设定列表,以便调用Person
的初始化程序。因此,Baby
从其初始化列表中调用Person
,因此被击中的第一件事是Baby
的初始化列表? - user4165455Person
的初始化列表,以及函数体是否从Baby
的初始化列表内部调用? - user4165455Baby
的初始化列表确定调用了Person
的哪个构造函数,当调用该构造函数时,相应的初始化列表控制了Person
成员的初始化。 - Brian Bi