本书的示例在类声明中使用“ explicit”关键字。无效吗?

时间:2019-07-18 08:35:37

标签: c++ class c++11

我正在看一本根据标准C ++ 11讲授C ++的书。本书展示了一个将子类标记为explicit的示例。

根据我的收集,这将使编译器检查与动态绑定有关的错误,并且每当您覆盖虚拟函数时,还必须显式使用override关键字,否则它将不会工作。我确实设置了一个小程序来对此进行测试,但出现错误。而且我从未见过关键字explicit的示例在其他任何地方都可以使用。

这本书提供的信息有误还是我只是错过了什么?我应该单独使用override关键字吗?

class base {
public:
    virtual void f() {
        cout << "Called from base" << endl;
    }
};

class derived explicit : public base {
public:
    void f() override {
        cout << "Called from derived" << endl;
    }
};

在终端上写c++ -std=c++11 main.cpp -o main.exe给了我以下错误:

error: expected unqualified-id 
class derived explicit : public base {
                   ^

1 个答案:

答案 0 :(得分:6)

在任何标准中,以这种方式使用explicit都不是有效的C ++。来自explicit上的cppreference:

  

1)指定构造函数或转换函数(自C ++ 11起)是显式的,也就是说,不能将其用于隐式转换和复制初始化。
  2)[...](特定于C ++ 20 ...)

...而且最重要的是:

  

显式说明符只能出现在其类定义内的构造函数或转换函数(自C ++ 11起)的声明的decl-specifier-seq中。

这并不涵盖您从书中看到的情况。看看curated list of books并考虑切换到其中一个。