我在一个c ++测试中找到了这段代码:
#include <iostream>
class A
{
public:
A(int n = 2) : m_i(n) { }
~A() { std::cout << m_i; }
protected:
int m_i;
};
class B
: public A
{
public:
B(int n) : m_x(m_i + 1) , m_a(n) { }
public:
~B()
{
std::cout << m_i;
--m_i;
}
private:
A m_x;
A m_a;
};
int main()
{
{ B b(5); }
std::cout << std::endl;
system("PAUSE");
return 0;
}
答案是:2531。但据我所知,这里只叫了两个析构函数: 首先是B,进入2; 第二个为A,进入1; 我们如何得到5号和3号?感谢任何帮助。
答案 0 :(得分:5)
B
还有两个类型为A
的数据成员,并且这些对象的析构函数(m_a
第一个,m_x
秒,以反向声明顺序)被调用B
的析构函数。
所以这里发生的是:
b
时,首先调用其A
基础子对象的构造函数,这是默认构造的,因为B
的构造函数的初始化列表不是为A
指定任何参数。这意味着b.m_i
将为2
; m_x
的{{1}}和m_a
子对象的构造函数将按声明顺序调用,传递指定的参数。这意味着b
将为b.m_x.m_i
(3
),b.m_i + 1
将为b.m_a.m_i
(5
); n
的{{1}}构造函数的主体被执行(这里没有什么可做的); B
的析构函数,它将输出b
并递减B
(将成为2
); b.m_i
的析构函数(它首先以反向声明顺序出现),它将打印1
; m_a
的析构函数,并打印5
; m_x
的{{1}}子对象的析构函数,并打印3
,现在为b
。答案 1 :(得分:0)
当您创建B项时,它会创建2个A项,值为3和5.