具有多态性的 C++ Final 类

问题描述

我有一个抽象类,它为我的应用程序定义了子模块的基本功能。 我们称这个抽象类为 IProdBridge

IProdBridge 包含虚拟和非虚拟方法以及一些纯虚拟方法

由于此软件在多种不同平台上运行,因此基类处理大部分功能,而其专业化处理特定于平台的功能(例如,在某些平台上处理字节序)。

让我们调用专门的类 TgurProdBridge

简单地从基类 IProdBridge 派生就可以了,但是我想将专用类标记final,因此将来可能不会被覆盖。

也许我现在只是脑子里放了个大屁屁,但我的专业类定义是这样的:

class TgurProdBridge final: public IProdBridge {
                                           // ^ error: expected class-name before ‘{’ token
        public: // +++ Static +++
            static TgurProdBridge& getInstance(milliseconds loopInterval = milliseconds(-1),ProdResponseCallback callback = {},json settings = "{}"_json,LogLevel logLevel = LOGLEVEL_MAXVALUE,string logPath = "") {
                static TgurProdBridge* instance = nullptr;

                if (instance == nullptr) {
                    if (loopInterval == DEFAULT_MS || !callback || settings.empty() || logLevel == LOGLEVEL_MAXVALUE || logPath.size() == 0) {
                        throw getSysError(0xbada79,"Invalid arguments passed for object instantiation! Did you set all the arguments?");
                    }

                    instance = new TgurProdBridge(loopInterval,callback,settings,logLevel,logPath);
                }

                return instance;
            }

        public: // +++ Destructor +++
            ~TgurProdBridge() {  }

        private: // +++ Constructor / Destructor +++
            TgurProdBridge(milliseconds loopInterval,ProdResponseDataCallback callback,json settings,LogLevel logLevel,string logPath):
            IProdBridge(loopInterval,settings) {
                getLoggerInstance() = new ConsoleLogger(__FUNCTION__,true,logPath,128);
                getLoggerInstance()->setCurrentApplicationName(__FUNCTION__);
                getLoggerInstance()->setCurrentLoggerFormat(
                    "[[    \033[1;34m%s\033[0m   ]] [%s] [%s] %s",ILogger::LOG_FMT_APPNAME.c_str(),ILogger::LOG_FMT_DATETIME.c_str(),ILogger::LOG_FMT_LOGLVL.c_str(),ILogger::LOG_FMT_MSG.c_str()
                );
            }

        private: // +++ Const Static (Defaults) +++
    };

出于某种原因,我的编译器 (g++ 6) 抛出以下错误

error: expected class-name before ‘{’ token
     class TgurProdBridge final: public IProdBridge {
                                                    ^

我正在编译支持 C++ 14。

为什么我会遇到这个问题?我应该能够将一个专门的类标记为 final;否则 final 关键字没有任何意义。

解决方法

我发现了错误

这可能是 PEBKAC 最糟糕的情况之一,但也许这会像我一样避免其他人进行搜索。

我不完全确定为什么这不会导致大量其他编译器错误,但问题出在我的命名空间上。

这个类嵌套在两个命名空间中:

namespace MyApp { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

然而,我的命名空间看起来像这样:

namespace { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

我无法理解为什么删除 final 关键字“修复”了这个错误。 很抱歉浪费您的时间?