文章目录
  1. 1. 不能再构造函数内使用 shared_from_this() 函数
  2. 2. 子类无法重复继承

不能再构造函数内使用 shared_from_this() 函数

1
2
3
4
5
6
7
8
class class_a : public std::enable_shared_from_this<class_a>
{
public:
class_a(void)
{
auto self(shared_from_this());// 这里会报 bad_weak_ptr 错误
}
};

子类无法重复继承

1
2
3
4
5
6
7
class class_a : public std::enable_shared_from_this<class_a>
{
};
class class_b : public class_a, public std::enable_shared_from_this<class_a>
{
};

这段代码将无法通过编译。
如果想返回子类的 shared_from_this 指针,则可以进行如下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class class_a : public std::enable_shared_from_this<class_a>
{
public:
virtual ~class_a()// 为了确保 dynamic_pointer_cast 可以工作,需要父类拥有虚函数。
{}
};
class class_b : public class_a
{
public:
std::shared_ptr<class_b> shared_from_this(void)
{
return std::dynamic_pointer_cast<class_b>(class_a::shared_from_this());
}
};

通常来说如果定义一个类时,如果这个类可能被继承使用时,将这个类的析构函数定义为虚函数来确保析构的调用顺序

文章目录
  1. 1. 不能再构造函数内使用 shared_from_this() 函数
  2. 2. 子类无法重复继承