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

Coc*_*ico 5 c++ qt subclassing

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

覆盖Java中没有子类化的方法

不确定c ++中是否还有一种方法.有任何想法吗?

eer*_*ika 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

如果要以这种方式覆盖它,可以将XStreamwith QWidgetwrapMapper其中一个虚拟类替换.

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

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


Ton*_*nyK 7

您的Java示例是一个子类 - 它只是一个匿名子类.该@Override关键字是一个简单的辅助诊断:如果方法不覆盖一个超则发出错误.删除@Override对生成的代码没有影响.C++ 11也有它 - 请看这个链接.

在C++中,就像在Java中一样,在不声明子类的情况下,不能覆盖虚函数.如果你想有效地使用Qt,你将不得不习惯它!