Qt / C ++覆盖函数没有子类化

时间:2014-08-28 07:37:52

标签: c++ qt subclassing

我想覆盖QWidget的虚函数而不进行子类化。它可以在java中。我找到了这个链接:

overriding methods without subclassing in Java

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

2 个答案:

答案 0 :(得分: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;
    }
};

如果您想以这种方式覆盖XStream,可以将QWidget替换为wrapMapper和{{1}}其中一个虚拟类。

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

在c ++中,匿名类(或结构)也可以是没有命名实例的类。它可以是另一个外部类的成员,并且匿名类的成员将被带到父类的命名空间。除此之外,标准不允许匿名类。那么这个东西怎么定义呢?好吧,匿名联盟允许的,匿名类与它们类似。但是,C11标准允许使用匿名结构。

答案 1 :(得分:7)

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

在Java中,与C ++一样,如果不声明子类,则无法覆盖虚函数。如果你想有效地使用Qt,你将不得不习惯它!