【发布时间】:2015-05-19 18:33:07
【问题描述】:
我有一个关于对基本构造函数的隐式和显式调用的问题。如果我们有这样的类层次结构:
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 的初始化列表之前。
- 由于车辆不继承任何东西,车辆的初始化列表被调用,它将
m_no_wheels初始化为0。 - Vehicle 的构造函数体被调用。
- 我们返回到 Bicycle,现在调用它的初始化列表,将
m_is_locked初始化为false。 - Bike 的构造函数体被调用。
有人可以解释一下我隐式调用背后的推理是否正确吗?
在我看来,主要区别在于,在显式引用基础构造函数时,总是首先点击子类的初始化列表才能调用基础构造函数 - 但是,通过隐式调用,最顶部的父级初始化列表总是最先被命中。
谢谢,非常感谢!
编辑:我特别询问订单是否更改,具体取决于对父类的隐式或显式调用。
【问题讨论】:
标签: c++ inheritance implicit explicit