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

时间:2013-06-24 18:38:46

标签: c++

我有一个如下所示的h.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()'

这个错误意味着什么?

3 个答案:

答案 0 :(得分:12)

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

在C ++ 11之前,在派生类成员函数的声明中重复virtual也是一种好习惯,尽管从技术上讲它不是必需的(因为规则是“曾经是虚拟的,总是虚拟的”) )。

C ++ 11引入了override关键字,它可以在覆盖虚拟成员函数时使用,以使代码安全地防止将来发生更改(即如果基函数更改签名,派生代码将无法编译而不是默默地变得错误)。在virtual出现时是否还包括override取决于个人品味/项目编码标准。我认为这是不必要的,省略了,但这只是我个人的偏好。

答案 1 :(得分:3)

问题正是编译器所说的。

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

答案 2 :(得分:-1)

这意味着A做某事不是虚拟的,但你试图让它变成纯虚的。