c++ - 用嵌入式私有(private)类覆盖 Qt 类

标签 c++ qt

在很多情况下,我想覆盖一个 Qt 类来扩展或修改它的行为。但是几乎所有的 Qt 类都使用了一个内部私有(private)类,例如 QNetworkDiskCache 内部的 QNetworkDiskCachePrivate。我知道这种方法有很多优点。但是私有(private)类有一个巨大的问题:它使得覆盖类变得更加困难。对于其他带有源代码的 C++ 类库,我通常会重写一个类方法,从父类中的实现中复制代码,并在这里或那里进行小的修改以实现我想要的行为。但是,在 Qt 中,私有(private)类不被导出,对派生类不可见。由于Qt类通过“d”成员在私有(private)类中维护关键的内部数据,私有(private)内部类的不可见性使得行为扩展的可能性非常有限。您只能使用少数暴露的公共(public)方法。

我尝试提取类的整个源文件并重命名类名和文件名。但 Qt 类库是如此复杂,以至于在大多数情况下从中提取单个类也很困惑。

我在这里错过了什么吗?或者 Qt 类在可扩展性方面真的很糟糕?

最佳答案

Qt 类在可扩展性方面优于大多数类;他们通常有钩子(Hook)来改变他们的行为,而无需诉诸复制和粘贴整个方法。话虽如此,如果普遍接受的扩展方法不起作用,是的,Qt 类更难破解。这可能是一件好事,因为复制-粘贴-和修改基类实现意味着您的派生类不会获得在基类实现中所做的任何改进或错误修复。

如果你想这样做,你需要说服你的构建系统让你包含私有(private)头文件,然后从你的新实现中引用私有(private)类。注意 Qt 文档中的免责声明;当您执行此操作时,您将面临发布的每个新版本 Qt 的破坏(Qt 仅保证公共(public) API,而您正在弄乱其内部结构)。 Qt 的公共(public) API 具有出色的可读性和文档化;内部代码可能非常神秘,所以您真的非常想确保您无法通过公共(public) API 完成您想要的事情。如果您仍然决定使用私有(private)类(class),this might help .

关于c++ - 用嵌入式私有(private)类覆盖 Qt 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12757012/

相关文章:

c++ - Eigen 中立方根的性能改进

macos - 在终端 MacOS 上运行 ffmpeg

python - 无法在图中添加图例

c++ - QT - 现有插槽在 mainwidow.cpp 中不可见

c++ - 将 int 转换为 char* 以打印

c++ - 无法随内容一起初始化 vector 的大小

c++ - 客户端计算机上必须安装什么才能运行 QT Quick 应用程序?

c++ - Qt foreach 在 Eclipse 中给我语法错误突出显示

c++ - 标准 :ostream and cross-platform compatibility

c++ - OpenCL:是否可以使用模板化对象作为 Boost::compute 的内核参数?