我看过类似的查询,但我似乎迷失了自己。我有一个简单的例子,请考虑以下内容:
#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() OR 编译器/程序是否查看Cat(),看它是Animal()并调用Animal()先是Cat()?
答案 0 :(得分:4)
当Cat构造函数被调用时,Animal构造函数在Cat构造函数体之前执行,作为Cat对象初始化的一部分。这与在初始化列表中明确地完成此操作相同:
Cat () : Animal() {
cout << "Cat" << endl;
}
如果要将参数传递给基类构造函数,则必须如上所述显式执行,否则将为您调用默认构造函数(没有参数的构造函数)。在任何一种情况下,基类构造函数都会在派生对象的初始化继续之前完成。
答案 1 :(得分:1)
当调用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;
}
};
答案 2 :(得分:0)
第一个Animal()然后调用Cat()。
首先,Animal类分配内存然后分配Cat。也许你想从Cat构造函数中的Animal访问资源。