我对两个代码块感到困惑。我将写下我的期望和结果。所以:
我有类似的代码:
#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()析构函数中,行为是相同的。
答案 0 :(得分:0)
~A()
的主体在A
的词汇范围内。这样,method()
中的呼叫~A()
被静态绑定到A::method
。不多不少。
由于调用了~A()
,因此又调用了此静态绑定的成员函数。