我正在看一本根据标准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 {
^
答案 0 :(得分:6)
在任何标准中,以这种方式使用explicit
都不是有效的C ++。来自explicit
上的cppreference:
1)指定构造函数或转换函数(自C ++ 11起)是显式的,也就是说,不能将其用于隐式转换和复制初始化。
2)[...](特定于C ++ 20 ...)
...而且最重要的是:
显式说明符只能出现在其类定义内的构造函数或转换函数(自C ++ 11起)的声明的decl-specifier-seq中。
这并不涵盖您从书中看到的情况。看看curated list of books并考虑切换到其中一个。