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