gpt4 book ai didi

c++ - 如果它有主体,在抽象构造函数/析构函数中调用纯虚函数是否安全?

转载 作者:太空狗 更新时间:2023-10-29 19:48:46 25 4
gpt4 key购买 nike

如果没有标有 BODY 的行,我知道这不安全。但是有了它,这样安全吗?

struct A
{
virtual ~A() { f(); }

virtual void f() = 0;
};

void A::f() {} // BODY

struct B : A
{
void f() {}
};

int main()
{
delete new B;
}

工作示例: http://ideone.com/9bRZ3i

最佳答案

不,那不安全。当 A 构造函数(或析构函数)正在执行时,对象的类型是 A,但还不是(不再是)B 对象。对 f() 的调用将尝试分派(dispatch)到(仍然)纯虚函数并导致未定义的行为。大多数实现会捕捉到这一点并终止应用程序,并显示一条错误消息,指示调用了纯虚函数。


修改后:

存在纯虚函数定义的事实意味着调用它是合法的无需通过虚分派(dispatch)。使用动态调度调用纯虚函数仍然是非法的。但是您可以将构造函数重写为:

A::~A() { A::f(); }  // qualification disables dynamic dispatch

没有动态调度,代码就有效了。

关于c++ - 如果它有主体,在抽象构造函数/析构函数中调用纯虚函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18456450/

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