C++ 首先调用哪个构造函数?

C++ 首先调用哪个构造函数?,c++,inheritance,constructor,ctor-initializer,C++,Inheritance,Constructor,Ctor Initializer,我看过类似的问题,但我似乎迷失了方向。我有一个简单的例子,请考虑以下内容: #include <iostream> using namespace std; class Animal { public: Animal() {cout << "Animal" << endl;} }; class Cat : public Animal { public: Cat() {cout << "Cat" << endl

我看过类似的问题,但我似乎迷失了方向。我有一个简单的例子,请考虑以下内容:

#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;
}

我现在的问题是:实际上首先调用哪个构造函数。是调用Cat()然后Cat()在执行其内容之前调用Animal()还是编译器/程序查看Cat(),确定它是Animal()并首先调用Animal(),然后调用Cat()?

调用Cat构造函数时,动物构造函数在Cat构造函数主体之前执行,作为Cat对象初始化的一部分。这与在初始化列表中显式执行此操作相同:

Cat () : Animal() {
     cout << "Cat" << endl;
}
猫():动物(){ cout首先调用Animal(),然后调用Cat()


首先,Animal类分配内存,然后分配Cat。可能您希望在Cat构造函数中访问Animal的资源。

调用Cat构造函数时,会发生两件事,首先执行初始化列表,然后执行构造函数。隐式地执行此操作:

class Cat : public Animal
{
  public:
    Cat() 
    : Animal()
    {
        cout << "Cat" << endl;
    };
};
类别猫:公共动物
{
公众:
猫()
:动物()
{

可能是后者,但为什么会有区别呢?最有可能的情况是先调用Cat,然后在打印“Cat”之前运行动物构造函数。但是如果您真的想测试这一点,请设置一个静态变量并打印,然后递增它,以查看哪个先运行。
Cat()
被调用,它做的第一件事是按适当的顺序调用所有基本构造函数,然后
vptr
如果需要(我想)还有初始值设定项列表,然后是它自己的主体。@Phericoxide有一个给学生的教程,我很好奇,因为他们有两个问题:他们调用的顺序是什么,执行的顺序是什么?答案显然是动物()然后是猫()我想知道这是否是真正的答案。<代码>首先,动物类分配内存<代码>。这里不是C++。+ 1好规则:<代码>,就像在初始化列表class Cat : public Animal { public: Cat() : Animal() { cout << "Cat" << endl; }; };
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;
    }
};