14

I have a.h as shown below

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

Then i have b.h as shown below

#include "a.h"

class b: public A
{
public:
    void doSomething();
};

I am just trying to check for syntax errors by trying to compile headers such as g++ -c a.h b.h

and i get below errror

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

What does this error means?

4

3 回答 3

20

= 0一个成员函数只有在它是虚函数时才能被声明为抽象( )。将virtual关键字添加到基类(在 class 中A)的函数声明中。

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

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

于 2013-06-24T18:40:08.200 回答
5

问题正是编译器所说的。

class A
{
public:
    virtual void doSomething()=0; // virtual keyword needed
};
于 2013-06-24T18:41:00.367 回答
-1

这意味着A' 做某事不是虚拟的,但您正试图使其成为纯虚拟的。

于 2013-06-24T18:40:18.513 回答