【问题标题】:Question about how the derived class works [closed]关于派生类如何工作的问题[关闭]
【发布时间】:2020-11-29 00:29:55
【问题描述】:

这是我期末考试的模拟测试。我必须能够解释这些代码是如何工作的。但老实说,我不太了解这段代码。 你们能解释一下我这是如何工作的吗?如果我能完全理解它,我会很高兴为我的决赛做好准备。谢谢。

   #include <iostream>
    using namespace std;
    class Wind {
        int category;
    public:
        Wind(int cat = 3) {
            category = cat;
            cout << "1." << cat << endl;
        }
        virtual void increase(int amount) {
            category += amount;
            cout << "A. " << category << endl;
        }
        void operator++() {
            ++category;
            cout << "B. " << category << endl;
        }
        virtual ~Wind() {
            cout << "C. " << category << endl;
        }
    };
    class Tornado : public Wind {
        double velocity;
    public:
        Tornado(int cat, double vel) : Wind(cat) {
            velocity = vel;
            cout << "2. " << vel << endl;
        }
        virtual void increase(int value) {
            velocity += value;
            cout << "X. " << velocity << endl;
        }
        void operator++() {
            Wind::operator++();
            velocity += 20;
            cout << "Y. " << endl;
        }
        ~Tornado() {
            cout << "Z. " << velocity << endl;
        }
    };
    int main() {
        Wind* wind_array[2];
        wind_array[0] = new Tornado(7, 66.5);
        wind_array[1] = new Wind(5);
        for (int i = 0; i < 2; i++) {
            wind_array[i]->increase(5);
            ++(*wind_array[i]);
        }
        for (int i = 0; i < 2; i++)
            delete wind_array[i];
        return 0;
    }

这是输出。

1.7
2. 66.5
1.5
X. 71.5
B. 8
A. 10
B. 11
Z. 71.5
C. 8
C. 11

【问题讨论】:

  • 请更具体一些。你不明白这段代码的哪一部分?你期望什么输出,你得到什么实际输出?
  • 我想我只了解前 3 行。但我什至不确定我是否理解正确。所以我想知道这段代码整体是如何工作的。
  • 因此,本质上,您希望有人向您解释有关代码如何工作的一切。那不会发生。该代码有几个元素相互作用 - 从“我只理解前三行”开始意味着任何人都必须付出巨大的努力来帮助你 - 并且处理你提出的基本问题,这些问题在任何介绍性中都有回答C++ 教科书。您可能需要从阅读任何关于 C++ 的基本介绍性文本开始——而且,最好是寻求理解——。
  • 对不起,其他部分我很努力,但我无法理解这一点。我仍然不明白为什么我们要定义虚函数的工作方式,因为我知道我们不应该为虚函数定义任何东西,而且我无法理解代码是如何工作的,我太绝望了。
  • 我真的建议你调试它,当你一步一步地接受它时非常简单:) 如果你不理解具体的输出,请询问我们。请记住,++是重载的,tornado是派生类,这意味着它将执行父亲的构造函数和之后的构造函数。

标签: c++


【解决方案1】:

请阅读有关虚函数和派生类的内容,之后就会有意义。

Derived classes

Virtual functions cpp

1.7 - constructor wind(Wind 是 tornado 的基类,所以 this 构造函数首先执行)
2. 66.5 - 构造函数 龙卷风
1.5 - 构造函数 wind
X. 71.5 - increase tornado(虚拟函数,因此不执行基类增加)
B. 8 - ++ wind(不是虚函数 - 所以tornado的++不被执行)
A. 10 - 增加
B. 11 - ++
Z. 71.5 - 析构函数 龙卷风
C. 8 - destructor wind(Wind 是基类)
C. 11 - 析构函数 wind

【讨论】:

  • 非常感谢,但我有几个问题。
  • 在第 4 行,即使是虚函数,指针也分配在基函数中。那不应该叫基数增加吗?在 ++ 的情况下,它不应该在执行基本运算符之后调用派生的 ++ 吗?据我所知,当它调用析构函数时,析构函数首先破坏最近的对象。它不应该先破坏数组1而不是数组0吗?
  • 1.虚函数“last”覆盖是最强的,它将搜索“最低”可用实现并执行它,而不是基类中的实现。在这种情况下,龙卷风的实施。 2. 不,因为 ++ 是 Not 虚函数,这意味着它将只执行基类实现。 3. 析构函数在 0 元素上被显式调用,然后在 1 元素上被显式调用,所以它会是这个顺序
  • 非常感谢。我想现在我什么都明白了。但只有最后一件事。在派生的析构函数中,为什么在这个函数工作后它会调用基析构函数?而不是像在构造函数中那样立即调用基析构函数?
  • 我认为这是一个很好的答案 -> stackoverflow.com/questions/3261694/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2019-11-16
  • 2016-09-30
  • 2022-06-12
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多