纯虚拟和std::shared_ptr

Pure virtual and std::shared_ptr

本文关键字:shared ptr std 虚拟      更新时间:2023-10-16

可能我只是错过了文档中的一些内容(或者只是无法进行正确的Google serach),但我对shared_ptr和纯虚拟函数有问题。

因此,一个有效的简短示例:

class Base
{
public:
    virtual int stuff() = 0;
};
class Derived : public Base
{
public:
    virtual int stuff() {return 6;}
};
class Container
{
public:
    Container() : m_x( 0 ) {}
    Container(Base* x) : m_x(x) {} 
private:
    Base* m_x;
};

由于我想使用新的花式std::shared_ptr,我将Container修改为:

class Container
{
public:
    Container() : m_x( std::make_shared<Base>() ) {}
    Container(const std::shared_ptr<Base>& x) : m_x(x) {} 
private:
    std::shared_ptr<Base> m_x;
};

clang和其他编译器抱怨说,这显然不起作用:Container() : m_x( std::make_shared<Base>() ) {}行中的error: allocating an object of abstract class type 'Base'

因此,问题是:如何使用std::shared_ptr实现这一点?

您的问题在这里:

Container() : m_x( std::make_shared<Base>() ) {}

不能创建Base对象。你想要的是一个空的shared_ptr。那就这么做吧。

Container() : m_x( std::shared_ptr<Base>() ) {}

或者这样做。

Container() : m_x() {}

这是平等的。

std::make_shared<Base>()等效于new Base()。您想要的是完全省略m_x初始化(默认构造函数会将其初始化为空),或者显式执行:

Container() : m_x(nullptr) {}

使用模板化构造函数直接构造对象
因此,除非,否则不能有默认构造函数

  • B变得非抽象
  • 你决定选择一个具体的、受欢迎的派生类,或者
  • 您接受0初始化CCD_ 11