在不使用子类化的情况下重写Qt/C++函数

6
我想重写一个QWidget的虚函数,但不想通过继承来实现。在Java中是可以做到的,我找到了这个链接:overriding methods without subclassing in Java。不确定在C++中是否也有类似的方法。有什么想法吗?

1
我认为这是不可能的。但如果最终目标是在Qt Creator的设计模式中使用新的子类,则完全可以实现。 - Ali
为什么你不想使用子类化? - Sir Digby Chicken Caesar
1
基本上因为我需要子类化大约10个不同的类,而每个类只有一个函数需要重新实现,所以我可以节省一些时间。但正如阿里所说,我也认为这是不可能的。 - Cocomico
原则上,你只能通过汇编语言来实现这一点,但这可能不是你想要的,而且这是一种相当粗糙的方式。在C++的上下文中,这是不可能的。 - Devolus
2个回答

11

没有继承就不能重写方法。链接的示例代码确实使用了子类。也许混淆是因为它没有使用extends关键字。它创建了一个XStream的匿名子类并重写了它的方法。这种类在C++中也存在,类似的代码也是可以实现的。命名约定有点不同。没有名称但具有命名实例的类称为未命名。以下是我对代码的转译,展示了如何使用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;
    }
};

如果您想以这种方式覆盖它,可以使用 QWidget 替换 XStreamwrapMapper 的虚拟类之一。

在Java中,匿名类通常用于回调。但是在C++中,我们有函数指针和最近的lambda表达式,这可能是为什么在C++代码中使用无名类的情况比Java少得多的原因。此外,在c++11之前,无名类不允许作为模板参数,因此它们将是回调函数对象的一个不良选择。

在C++中,匿名 类(或结构)将没有命名实例。它可以是另一个外部类的成员,并且匿名类的成员将带到父类的命名空间中。但是,匿名类不被标准允许。那么怎么会有这种东西的定义呢?嗯,匿名联合是被允许的,而匿名类与之类似。匿名结构体由C11标准允许。


7
你的Java示例是一个子类 -- 它只是一个匿名子类。 @Override 关键字只是一种诊断工具:如果该方法没有覆盖超类,则会发出错误。 删除 @Override 对生成的代码没有影响。C++11 也有这个功能 -- 参见此链接
在C++和Java中,你不能在不声明子类的情况下重写虚函数。如果你想有效地使用Qt,你将必须习惯它!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接