先调用哪个构造函数
Which constructor is called first?
我看过类似的查询,但我似乎迷失了方向。我有一个简单的例子,所以请考虑以下内容:
#include <iostream>
using namespace std;
class Animal
{
public:
Animal() {cout << "Animal" << endl;}
};
class Cat : public Animal
{
public:
Cat() {cout << "Cat" << endl;};
};
int main()
{
Cat c;
return 0;
}
当程序运行时,它显示
Animal
Cat
我现在的问题是:哪一个构造函数实际上首先被调用。在执行其内容之前是否调用了Cat(),然后Cat()调用了Animal()或者编译器/程序是否查看Cat()是否为Animal),并先调用Animal,然后再调用Cat()?
调用Cat构造函数时,Animal构造函数在Cat构造函数体之前执行,作为Cat对象初始化的一部分。这与您在初始化列表中明确执行此操作相同:
Cat () : Animal() {
cout << "Cat" << endl;
}
如果要将参数传递给基类构造函数,则必须如上所述显式执行,否则将调用默认构造函数(不带参数的构造函数)。在任何一种情况下,基类构造函数都会在派生对象的初始化继续之前完成。
当调用Cat构造函数时,会发生两件事,首先执行初始化列表,然后执行构造函数。暗示你正在这样做:
class Cat : public Animal
{
public:
Cat()
: Animal()
{
cout << "Cat" << endl;
};
};
然后Animal构造函数在Cat构造函数的Cat实现之前执行,但在它初始化列表之后执行。例如,如果Cat和Animal类有一些成员,并且你想在构造函数中初始化它们,你可以更容易地看到:
class Animal
{
private:
bool haveHair;
public:
Animal(bool hair)
: haveHair(hair)
{
cout << "Animal" << endl;
}
};
class Cat : public Animal
{
public:
Cat()
: Animal(true)
{
cout << "Cat" << endl;
}
};
首先调用Animal(),然后调用Cat。
首先是Animal类分配内存,然后是Cat。也许你想在Cat构造函数中访问Animal的资源。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用