无效的抽象类类型'A'的new表达式

时间:2019-04-01 00:42:18

标签: c++

为什么这个小例子:

class A {
public:
    virtual void run() = 0;
};

class B : public A {
public:
    void run() override {
        std::cout << "Running...\n";
    }
};

int main() {
    std::unique_ptr<A> a = std::make_unique<A>(new B());
}

给我这个错误信息:

error: invalid new-expression of abstract class type 'A'
     { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
because the following virtual functions are pure within 'A':
 class A {
'virtual void A::run()'
     virtual void run() = 0;

这是因为unique_ptr不能将抽象类作为参数吗?

1 个答案:

答案 0 :(得分:2)

  

为什么这个小例子:...给我这个错误消息:invalid new-expression of abstract

     

这是因为unique_ptr不能将抽象类作为参数吗?

不,不是。 std::unique_ptr可以将抽象类作为参数。

这是因为您正在尝试创建A的实例。这是不可能的,因为A是虚拟的。

您可能打算创建B的实例,并让std::unique_ptr<A>拥有该指针的所有权:

std::unique_ptr<A> a = std::make_unique<B>();

但是请注意,您不要让该指针超出范围,因为在破坏a时,该对象将通过指向A的指针被删除,并且由于该指针对象是B,并且A的析构函数不是虚拟的,则该行为是不确定的。解决方案,将A::~A声明为虚拟。