了解虚函数和析构函数调用

时间:2019-01-13 11:41:46

标签: c++

我对两个代码块感到困惑。我将写下我的期望和结果。所以:

我有类似的代码:

#include <iostream>

class Base {

    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() {
        std::cout<<"Destructor a" << std::endl;
        method();
    }
    void baseMethod() 
    {
        std::cout<<"Called A" << std::endl;
        method();
    }
};

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

并在终端中输出:

from Base
Destructor a
from A
from Base

问题是,method()不是虚拟的。例如,在主函数的baseMethod()调用中,调用base-> baseMethod()会调用基类baseMethod,而在baseMethod()内部,则调用method()。由于method()不是虚拟的,因此它将调用Base classes方法并打印“ From Base”。可以。

但是.. 用行

删除基点时
delete Base;

由于基类析构函数是虚拟的,因此其调用派生类析构函数〜A()。在此析构函数内,method()调用。但是通过查看输出,此method()调用将调用A类的method()并从A打印到屏幕。但是method()不是virtual。基类指针调用的析构函数指向,不久,我期望析构函数A中的From B,但它从From打印。它是什么?

我的期望:

from Base
Destructor a
from Base
from Base

当我向该行添加虚拟时:

class Base {

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

输出为:

from A
Destructor a
from A
from Base

您可以看到,从baseMethod调用的method()中的行为已更改,并且输出也已更改。但是在〜A()析构函数中,行为是相同的。

1 个答案:

答案 0 :(得分:0)

~A()的主体在A的词汇范围内。这样,method()中的呼叫~A()静态绑定到A::method。不多不少。

由于调用了~A(),因此又调用了此静态绑定的成员函数。