【问题标题】:C++ ( Classes and pointers)C++(类和指针)
【发布时间】:2019-02-26 05:05:46
【问题描述】:
#include <iostream>

class Base {
    virtual void method() {std::cout << "from Base" << std::endl;}
public:
    virtual ~Base() {method();}
    void baseMethod() {method();}
};

class A : public Base {
    void method() {std::cout << "from A" << std::endl;}
public:
    ~A() {method();}
};

int main(void) {
    Base* base = new A;
    base->baseMethod();
    delete base;
    return 0;
}

我不明白为什么这段代码的输出是: 从一个 从一个 来自基地

从技术上讲,它应该只打印“from A”。

【问题讨论】:

  • 不要从析构函数中调用虚方法。在这里查看这个出色的答案:link

标签: c++ class pointers


【解决方案1】:

base 是 A 类型的对象, 所以base->baseMethod()会调用A的虚方法method()的实现, 打印“来自 A”, method() 从 A 和 base 的 d'tors 中调用, 当在 cpp 中删除一个对象时,它的 d'tor 被调用,并且它的基类 d'tor 在之后(创建对象时的相反)被调用,所以: “来自 A” “从基地” 被打印出来了。

【讨论】:

    【解决方案2】:

    它称为Upcast,请查看链接中的示例以获取更多信息。第一个“from A”发生在您执行时:

     base->baseMethod();
    

    调用A的析构函数时第二个“from A”,调用Base的析构函数时打印“from Base”。

    【讨论】:

      【解决方案3】:

      当我们调用base-&gt;baseMethod() 时,它会调用Base::baseMethod,因为它没有被class A 覆盖。 baseMethod 调用method 函数,因为baseclass A 的指针,它调用A::method,因为它被覆盖了。即使该方法是私有的,它也遵循多态行为。

      delete base被执行时,派生类的第一个析构函数被调用,因为Base class析构函数是虚拟的。派生类析构函数调用它自己的method 函数。如果我们没有虚拟析构函数,则不会调用派生的析构函数,因此您只看到一个 from A 作为输出与基类的输出相匹配

      之后它调用基类析构函数,并且仅在派生类已被析构时才调用method functionmethod function

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多