【发布时间】:2015-08-04 22:20:33
【问题描述】:
我正在通过一些关于 C++ 的在线测验,下面是我遇到的问题
http://www.interqiew.com/ask?ta=tqcpp01&qn=3
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_a1(m_i + 1), m_a2(n) { }
public:
~B()
{
std::cout << m_i;
--m_i;
}
private:
A m_a1;
A m_a2;
};
int main()
{
{ B b(5); }
std::cout << std::endl;
return 0;
}
答案是“2531” -
我期待答案是“21” - 理由如下(这似乎是错误的):
对象 B 由三个成员变量创建,起始值为 2 - 253
所以当调用析构函数时会以相反的顺序被删除。
对于这种情况,析构函数将调用继承的部分 - 我们打印 2 我们递减值并转到 1,然后打印删除时的基数 - 所以回答 21
如何打印变量 m_a2 和 m_a1 - 无法理解。 它也在基础部分(即 A 类)中打印(值 53)
【问题讨论】:
-
B 中无用的代码混淆将 A 的成员初始化为自己的成员。
-
m_a2和m_a1在它们的包含对象b被销毁时被销毁。由于A的析构函数输出了东西,所以东西被销毁的时候就输出了。
标签: c++ inheritance destructor