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

Posted

技术标签:

【中文标题】本书示例在类声明中使用“显式”关键字。无效吗?【英文标题】:Book example uses "explicit" keyword in class declaration. Is it invalid? 【发布时间】:2019-07-18 08:35:37 【问题描述】:

我正在关注一本根据标准 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】:

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

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

...最重要的是:

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

这不包括你在书中展示的案例。查看curated list of books 并考虑切换到其中之一。

【讨论】:

以上是关于本书示例在类声明中使用“显式”关键字。无效吗?的主要内容,如果未能解决你的问题,请参考以下文章

C# 修饰符“static”对该项无效

单例设计模式 - 在类外显式声明构造函数

this关键字介绍

super关键字的使用

C语言的关键字

C++中explicit关键字