这个问题已经在这里有一个答案:
我已经看过类似的查询,但我似乎得到自己丢失。我有一个简单的例子,所以请考虑以下几点:
#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 () : Animal() {
cout << "Cat" << endl;
}
如果你想传递参数给基类的构造函数,那么你必须做明确如上,否则默认的构造函数(不带参数)就会被调用。在任一情况下,所导出的对象的初始化继续之前的基类的构造完成。
当猫调用构造函数,两件事情情况,首先执行初始化列表,然后建设中的作用。隐你这样做:
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;
}
};
第一个动物(),然后猫()被调用。
首先是动物类分配内存,然后猫。也许你想从动物访问资源,在猫的构造。