Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ initialized specified for non-virtual method

Tags:

c++

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?

like image 715
Jimm Avatar asked Jun 24 '13 18:06

Jimm


2 Answers

A member function can only be declared abstract (= 0) if it is virtual. Add the virtual keyword to the function declaration in the base class (in class A).

Prior to C++11, it was also good practice to repeat virtual in the declaration of the derived class member function, although it's technically not necessary there (as the rule is "once virtual, always virtual").

C++11 introduced the override keyword which can should used when overriding a virtual member function, to make the code safe against future changes (i.e. if the base function changes signature, the derived code will fail to compile instead of silently becoming wrong). Whether to also include virtual when override is present is up to personal taste/project coding standards. I consider it unnecessary and omit it, but that's just my personal preference.

like image 84
Angew is no longer proud of SO Avatar answered Sep 19 '22 00:09

Angew is no longer proud of SO


The problem is exactly what the compiler says it is.

class A
{
public:
    virtual void doSomething()=0; // virtual keyword needed
};
like image 42
Wug Avatar answered Sep 18 '22 00:09

Wug