C ++继承练习

时间:2011-01-06 14:36:35

标签: c++ inheritance

      Class One : public Two
        {
        public:
           One()
           {
              Three three;
              cout << "something";
           }
        private:
           Four _four;
       };

我必须显示一句话:“一二三四五六七”,第一类必须保持不变。每个类在构造函数和析构函数中都不能显示多个单词。

所以......我发现我的基类是四级。我也做了建设。 &安培; destr。在每个班级,并试图在他们的身体写东西,但这就是我的输出:

Class Four Constructor:
Class Three Constructor:
Class Two Constructor:
Class Four Constructor:
Class Four Constructor:
Class Three Constructor:
Class One Constructor:
Class Three Destructor:
Class Four Destructor:

DESTRUCTION:
Class One Destructor:
Class Four Destructor:
Class Two Destructor:
Class Three Destructor:
Class Four Destructor:

我的主要职能:

int main()
{
 One one; //<----  it also have to remain
 cout << endl;
 cout << "DESTRUCTION:\n";
}

我已经阅读了一些关于继承的文章,但仍然不知道如何在类constr中显示单词。 &安培;析构函数,但不要做两次或更多,即使我创建这些类的对象,就像它在第一类中完成。

P.S对不起语法和其他错误;)

5 个答案:

答案 0 :(得分:4)

我们可以根据One的已知定义(以及我对C ++构造规则的记忆,可能不是100%准确:-)来推断,而不考虑任何其他可能的继承关系课程:

  1. Two()(作为基类构造函数)的输出位于所有其他构造函数的输出之前,
  2. 接下来是Four()(属于派生类的成员)的输出,
  3. 然后输出Three()One()构造函数中的本地对象),
  4. 然后是One()本身的输出,
  5. 然后是~Three()的输出(作为局部变量,从One()返回时超出范围。)
  6. 在这里我们构建了闪亮的One对象。由于我们无法用它做多少,让我们摧毁它!请注意,所有对象都与其构造顺序完全相反;这是一个基本的C ++规则。因此

    1. 首先出现~Four()的输出(因为成员在其拥有者之前被销毁),
    2. (然后会出现不存在的~One()的输出,因为类的派生部分在其基本部分之前被销毁),
    3. 然后作为基础部分的~Two()的输出最后被销毁。
    4. 这为您输出了七个可能的数字,因此您无需任何其他基类或成员。只需将正确的数字放入正确构造函数的输出中即可。析构函数: - )

答案 1 :(得分:1)

你已将此标记为家庭作业,所以我不打算告诉你答案......

此练习似乎旨在帮助您了解构造函数和析构函数的调用顺序。由于您只能使用类继承,成员变量,构造函数和析构函数,因此它们是您确定程序流的唯一机制,因此也就是输出的顺序

有些问题:

  • 首先执行其身体,a 派生类构造函数或基础 类构造函数?破坏者怎么样?
  • 是成员的构造函数 变量在执行之前执行 包含类的构造函数? 破坏者怎么样?

我建议从一个简单的例子开始。两个类,每个类都有一个构造函数和析构函数,另一个是另一个子类。在每个功能中打印一些内容,然后查看订购。然后添加另一个类,使其成为成员变量。会发生什么?

因为,你必须输出奇数个单词,一个类必须只在它的构造函数或析构函数中打印,但不能同时打印。

顺便说一句,在你的问题类中,第四类不是基类。

祝你好运!

答案 2 :(得分:1)

答案 3 :(得分:0)

您可能正在尝试确定调用构造函数的顺序。当你调用一个构造函数时,超类的构造函数首先执行(注意我比Java更熟于Java,所以在这里要小心)。因此,如果One从继承自Three的两个继承并且您调用One的构造函数,那么顺序将是:Three,Two,One。

答案 4 :(得分:0)

也明白这一点 -

从标准文档,删除,

  

在第一个替代(删除对象)中,如果操作数的静态类型不同   从动态类型来看,静态类型应该是操作数的动态类型的基类,而静态类型应该有一个虚析构函数,或者行为是未定义的。