一,问题现象
子类使用override标记了虚函数,编译报错marked ‘override‘, but does not override。
二,问题分析
示例代码如下:
——basic.h
#ifndef _BASIC_H
#define _BASIC_H
class Basic {
public:
virtual void func() = 0;
};
#endif //_BASIC_H
——derive.h
#ifndef _DERIVE_H
#define _DERIVE_H
#include "basic.h"
class Derive : public Basic {
public:
virtual void func() override {}
virtual void func(int a) override {}
};
#endif //_DERIVE_H
——main.cpp
#include "basic.h"
#include "derive.h"
int main()
{
Basic *bass = new Derive;
return 0;
}
编译报错如下:
derive.h:15:15: error: ‘virtual void Derive::func(int)’ marked ‘override’, but does not override
virtual void func(int a) override {}
原因是Basic未声明“virtual void func(int a)”,而子类Derive却使用override 标记该函数,故报错marked ‘override‘, but does not override。
备注下C++ override用法:
在C++中,override关键字用于指示一个成员函数是重写了基类中的虚函数。使用override关键字可以帮助编译器在编译时检查你是否正确地重写了基类中的虚函数。
三,解决方案
子类使用override标记了虚函数,那么此函数在基类必须声明,修改如下:
——basic.h
#ifndef _BASIC_H
#define _BASIC_H
class Basic {
public:
virtual void func() = 0;
virtual void func(int a) = 0; //子类使用override,基类需要声明
};
#endif //_BASIC_H