gpt4 book ai didi

c++ - 当析构函数调用抽象函数时会发生什么

转载 作者:IT老高 更新时间:2023-10-28 22:17:14 30 4
gpt4 key购买 nike

我无法理解以下代码中崩溃的原因:

class A {
public:
virtual ~A() { goo(); }
void goo() { absFoo(); }
virtual void absFoo() = 0;

};

class B : public A {
public:
void absFoo() { cout << "In B \n"; }
};

int main()
{
B b1;
b1.goo();
}

main按预期打印“In B”,但最后当它崩溃时,我也无法调试它,编译器弹出一条奇怪的消息。

所以我的问题是,当 A 的析构函数调用“goo()”时,“absFoo()”会崩溃吗因为我们指的是抽象函数?

或者编译器真的会在派生类中寻找定义吗?(而且它已经不存在了,因为它事先被破坏了,所以它崩溃了)

我知道如果我们直接从析构函数中调用“absFoo()”,原因应该是抽象函数。但由于这里是一个调用“absFoo()”的外部函数,我无法理解真正的原因。

最佳答案

What happens when a destructor calls an abstract function

首先,让我们考虑一下当析构函数调用任何虚函数时会发生什么(顺便说一句,构造函数也是如此): 当虚函数 foo 的析构函数中被调用时T,调用不会被动态分派(dispatch)给派生类型的实现(任何派生对象的生命周期已经结束),而是静态分派(dispatch)给实现T::foo

如果 T::foo 是纯虚拟的,那么在没有动态调度的情况下调用它将会有未定义的行为。这就是在析构函数(或构造函数)中(间接)调用纯虚函数时发生的情况。

关于c++ - 当析构函数调用抽象函数时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768298/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com