【问题标题】:Qt/C++ Override function without subclassing没有子类化的 Qt/C++ 覆盖函数
【发布时间】:2014-08-28 07:37:52
【问题描述】:

我想重写 QWidget 的虚函数而不继承它。在java中是可能的。我找到了这个链接:

overriding methods without subclassing in Java

不确定c++中是否也有办法。有什么想法吗?

【问题讨论】:

  • 我认为这是不可能的。但如果最终目标是在 Qt Creator 的设计模式下使用新的子类,那是完全有可能的。
  • 你为什么不想子类化?
  • 基本上是因为我必须继承 10 个不同的类,并且每个类只有一个功能需要重新实现。所以我会节省一些时间。但正如阿里所说,我也不认为这是可能的。
  • 原则上你只能通过汇编程序来做到这一点,但这可能不是你想要的,而且是一种相当老套的方式。在 C++ 的上下文中这是不可能的。

标签: c++ qt subclassing


【解决方案1】:

没有继承就无法覆盖。链接示例中的代码确实是子类。也许混淆来自于它不使用extends 关键字这一事实。它创建XStream 的匿名子类并覆盖它的方法。此类类也存在于 C++ 中,并且可能有类似的代码。命名约定有点不同。没有名称但有命名实例的类称为 unnamed 。这是我对代码的音译,以展示如何使用 C++ 中的未命名类来完成示例:

class SomeClass {
public:
    void myMethod() {
        class: public XStream {
        protected:
            MapperWrapper wrapMapper(const MapperWrapper& next) override {
                return MapperWrapper(next); // the example is cut off here, persumably it's creating another nested anonymous class, but i'll keep this simple
            }
        } xstream;
    }
};

如果您想以这种方式覆盖XStream,可以将QWidgetwrapMapper 替换为其中一个虚拟类。

匿名类通常用于 Java 中的回调。但是在 C++ 中,我们有函数指针和最近的 lambda,这可能就是为什么与 Java 相比,C++ 代码中使用未命名类的情况要少得多。此外,在 c++11 之前,未命名的类不允许作为模板参数,因此它们对于回调函子来说是一个糟糕的选择。

在 C++ 中,Anonymous 类(或结构)也将是没有命名实例的类。它可以是另一个外部类的成员,并且匿名类的成员将被带到父类的命名空间。除了,标准不允许匿名类。那怎么会有这样的定义呢?好吧,允许匿名联合,并且匿名类与它们类似。不过,C11 标准允许匿名结构。

【讨论】:

    【解决方案2】:

    您的 Java 示例是一个子类——它只是一个匿名子类。 @Override 关键字只是一个诊断帮助:如果方法没有覆盖超类,它会发出错误。删除 @Override 对生成的代码没有影响。 C++11 也有——见this link

    在 C++ 中和在 Java 中一样,您不能在不声明子类的情况下覆盖虚函数。如果你想有效地使用 Qt,你必须习惯它!

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2012-12-17
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多