在类定义之外不允许覆盖

时间:2018-10-03 12:56:45

标签: c++ c++17

我创建了一个抽象类和一个具体的子类:

//bca.h
#include <string>
class bca {
public:
    virtual std::string get_virtual_year() const = 0;
};
//bca_interface.h
#include "bca.h"
class bca_interface : public bca {
public:
    std::string get_virtual_year() const override;
};
//bca_interface.cpp
#include "bca_interface.h"
std::string bca::get_virtual_year() const override {
    return "";
}

当我使用g ++编译bca_interface.cpp时,我得到:

 error: virt-specifiers in ‘get_virtual_year’ not allowed outside a class definition
 std::string bca::get_virtual_year() const override {

2 个答案:

答案 0 :(得分:4)

错误说明了一切

error: virt-specifiers in ‘get_virtual_year’ not allowed outside a class definition

您不能将 virt-specifier overridefinal)放在类定义之外。您只能将该说明符放在类定义中的函数声明上。例如explicitstaticvirtual,...

标头中的位置正确。在您的源代码中,只需将其删除即可。

答案 1 :(得分:3)

override关键字仅在成员的声明中使用(在类定义中,如错误消息所述)。就在这里。

该定义并不关心它是否是一个覆盖的实现,只是它具有相同的签名(包括const)。

//bca_interface.h
class bca_interface : public bca {
public:
private:
    std::string get_virtual_year() const override;
    //                                   ^^^^^^^^ correct
};
//bca_interface.cpp
std::string bca_interface::get_virtual_year() const {
    //                                  ^^^ not required (or allowed) here
    return "";
}

当然,如果您的声明也是定义,那么欢迎override