【发布时间】:2015-05-24 03:12:43
【问题描述】:
以下代码来自在线 C++ 测验部分 http://www.interqiew.com/ask?ta=tqcpp02&qn=3 - 我无法找出答案 - 我已添加打印语句 -
这是我的理解
步骤 A - 对象 B 的创建从参数 m_x 的 B 的构造函数开始 - 我们到达基类 A -- 步骤 1 执行输出 0 - 并将 m_i 增加到 1
步骤 B - 代码现在变为 m_x(2) -- 步骤 1 执行输出 2 并将 m_i 增加到 3 创建 m_x 完成
步骤 C - 代码到达 A[2] (所以下面的两个对象会发生) -- 步骤 1 执行输出 0 并将 m_i 递增到 1 A[0] 和 A[1] 的创建完成
我正在用 3 个容器 m_x 、 A[0] 和 A[1] 可视化对象 b,每个容器的值为 m_i
我不明白下面的输出 - 我们如何获得输出 2 - 使用了 m_i 的哪个值?
Step D - 进入 step3 区域 -- step 3 执行输出 2
输出 -
步骤 1 --- 0 1 步骤 1 --- 2 3 步骤 1 --- 0 1 步骤 1 --- 0 1 第三步----2
class A
{
public:
A(int n = 0)
: m_i(n)
{
std::cout << "step 1 --- " << m_i << endl;
++m_i;
std::cout << m_i << endl;
}
protected:
int m_i;
};
class B
: public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i)
{
std::cout << "step 3 ----" << m_i << endl;
}
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
【问题讨论】:
-
应该是第 1 步等吗?顺便说一句 - 您忘记了需要先构建基础的继承
-
B构造函数首先构造它的基类A,然后继续构造它的成员,按照它们在类定义中出现的顺序——首先是m_x,然后是m_a。在m_a的初始化器中构造了另外两个A实例。最后,B构造函数的主体被执行。 -
啊,所以你的意思是 - 这将类似于步骤 0 - b 的构造函数 - 到达基类 - 执行步骤 -1 即 0 并将其递增到值 1 - 现在创建 m_x 递增到2输出到2等等..我想我现在明白了..!!!谢谢
标签: c++ inheritance constructor