我有一个如下所示的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()'
这个错误意味着什么?
答案 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
做某事不是虚拟的,但你试图让它变成纯虚的。