为非虚拟方法指定的c++已初始化

c++ initialized specified for non-virtual method

本文关键字:c++ 初始化 虚拟 方法      更新时间:2023-10-16

我有如下所示的a.h

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

然后我有b.h,如下所示

#include "a.h"
class b: public A
{
public:
    void doSomething();
};

我只是试图通过编译诸如g++ -c a.h b.h

我得到错误以下

a.h:4: error: initializer specified for non-virtual method 'void A::doSomething()'

这个错误意味着什么?

如果成员函数是虚拟的,则只能将其声明为抽象的(= 0)。将virtual关键字添加到基类中的函数声明中(在类A中)。

在C++11之前,在派生类成员函数的声明中重复virtual也是一种很好的做法,尽管在技术上没有必要(因为规则是"一旦虚拟,总是虚拟")。

C++11引入了override关键字,该关键字可以在重写虚拟成员函数时使用,以使代码免受未来更改的影响(即,如果基函数更改了签名,则派生代码将无法编译,而不是默默地出错)。当存在override时是否也包括virtual取决于个人品味/项目编码标准。我认为它没有必要,所以省略了它,但这只是我个人的喜好。

问题正是编译器所说的。

class A
{
public:
    virtual void doSomething()=0; // virtual keyword needed
};

这意味着A的某些操作不是虚拟的,但您正试图使其成为纯虚拟的。