#include <iostream>
#include <string>
using namespace std;
class Person
{
string name;
public:
Person():name("")
{
cout << "Person default ctor\n";
}
Person(const string& name_in):name(name_in)
{
cout << "Person string ctor: " << name << "\n";
}
~Person()
{
cout << "Person dtor: " << name << "\n";
}
string get_name()
{
return name;
}
};
class Professor:public Person
{
int office;
public:
Professor(const string& name_in, int office_in):Person(name_in), office(office_in)
{
cout << "Professor string ctor: " << get_name() << endl;
}
~Professor()
{
cout << "Professor dtro: " << get_name() << endl;
}
};
int main()
{
Person alice("Alice");
Professor bob("Bob", 10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为输出应该是:
Person string ctor: Alice
Person dtor: Alice
Professor string ctor: Bob
Professor dtor: Bob
Run Code Online (Sandbox Code Playgroud)
因为看起来逻辑上应该遵循程序的结构.但是,实际输出是:
Person string ctor: Alice
Person string ctor: Bob
Professor string ctor: Bob
Professor dtor: Bob
Person dtor: Bob
Person dtor: Alice
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样吗?我怎么不理解那些让我想出错误输出的类/构造函数/析构函数?
首先,Professor源于Person.这意味着,每个实例Professor暗含的一个实例Person(观察你如何调用Person(name_in)中Professor的构造函数).当Professor对象被销毁时,这个隐式实例将自动被销毁.
这解释了为什么你看到:
Person string ctor: Bob
Person dtor: Bob
Run Code Online (Sandbox Code Playgroud)
对于析构函数调用的顺序,变量以相反的构造顺序销毁.这解释了为什么Bob在爱丽丝之前被摧毁
Person string ctor: Alice
Professor string ctor: Bob
Professor dtor: Bob
Person dtor: Alice
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |