gpt4 book ai didi

c++ - shared_ptr 没有找到虚方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:18 26 4
gpt4 key购买 nike

我有一个抽象基类,它在它的构造函数中调用一个虚方法。传递基类的 shared_ptr 后,未找到该方法的实现。

class a 
{
public:
a() { fill(); }
protected:
virtual void fill() = 0;
}

class b : public a
{
public:
b() : a();
protected:
virtual void fill() { // do something }
}
....

shared_ptr<a> sptr = shared_ptr<a> ( new b()): // error happens here on runtime

当执行这个时,我得到一个 SIGABRT,因为它试图执行 virtual void fill() = 0;

最佳答案

您不能从构造函数中调用纯虚函数。在构造函数运行时,对象被认为是正在构造的类型,而不是任何派生类型。这意味着虚拟分派(dispatch)“停止”在正在构造的类型上。

这意味着调用 fill()来自 a 的构造函数将尝试调用 a::fill() ,无论此 a 属于哪个派生类子对象可以是一部分。这当然会惨遭失败,因为该函数没有实现。


此外,正如@KerrekSB 指出的那样,您的类需要一个虚拟析构函数。否则,如果你曾经 delete,你将得到未定义的行为。一个b通过指向 a 的指针实例(当涉及 shared_ptr<a> 时很有可能)。

更新 显然,shared_ptr能够使用默认的删除器属性来解决虚拟析构函数的必要性,所以你的类在技术上没有一个。尽管如此,如果没有虚拟析构函数,您的类(class)取决于在 std::shared_ptr 中进行管理仅;如果你改变了那一点设计,你就会遇到麻烦(而且不会立即显而易见)。因此,我建议无论如何都要有一个虚拟析构函数。

关于c++ - shared_ptr 没有找到虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219243/

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